【发布时间】:2015-04-20 18:55:37
【问题描述】:
我在 Unix 中工作,我正在尝试编写一个 .c 文件来执行以下操作:
对于每个命令行参数,主进程将启动一个子进程(类型 A)。
A 进程将尝试在新的子进程(类型 B)中使用 exec 函数之一执行接收到的参数。
如果失败,类型 A 的进程将使用管道通道向其父进程发送 exec 调用生成的错误代码(errno 值)。
成功后,进程 A 将等待类型 B 的进程,一旦完成,它将使用相同的管道通道将零代码传输给其父级。
如果执行成功与否,主进程将打印每个参数。仅对于失败的执行,也会打印收到的错误代码。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main(int argc, char const *argv[]) {
int c2p[2], g2c[2];
int i;
char n[100];
int *stat;
for (i = 0; i < argc; i++ ) {
pipe(c2p);
pipe(g2c);
if (fork() == 0) {
//child code
if (fork() == 0) {
//grandchild code
if (execlp("argv[i]", "argv[i]", NULL) == -1) {
write(g2c[1], errno, sizeof(int));
} else {
write(g2c[1], 0, sizeof(int));
}
}
wait(0);
read(g2c[0], n, 10);
write(c2p[1], n, 10);
exit(0);
}
read(c2p[0], &stat, sizeof(int));
if (*stat !=0) {
printf("Not succsesful: %s %d\n", argv[i], *stat);
} else {
printf("Succes! %s\n", argv[i]);
}
}
return 0;
}
【问题讨论】:
-
你需要
fork和wait,不需要管道。 -
专业提示:使用函数使您的代码更易于理解和推理。