我是 C 的新手,所以如果这是一个简单的问题,我深表歉意。我正在写一个 C 程序,其中一部分如下。整个程序的目标是将文件从一个位置复制到另一个位置(文件作为参数传递,最后一个参数是目标)。下面的 main()
使用 fork()
为每个传递的文件创建一个子进程,我需要打印出文件名(只是输入参数)带有一条消息,其中可能包含所有子进程运行后每次复制尝试的 PID。
我显然可以获取和使用 PID,这不是问题,但我如何才能获取与该进程关联的正确文件名/参数?我现在那里的方法显然是错误的;简单地按顺序遍历每个参数是不正确的。这将在 Minix 2.0.4 上运行,但我不知道这是否重要。
int
main(int argc, char *argv[])
{
int i, pid, rem, status;
int pids[argc];
char cfstatus[];
rem = argc;
for(i = 1; i < argc; i++) {
if((pids[i] = fork()) < 0) {
fprintf(stderr, "Error while forking");
}
else if(pids[i] == 0) {
if(copyfile(argv[i], argv[argc - 1]) == 1)
exit(4);
else
exit(0);
}
}
i = 0;
while(rem > 1) {
pid = wait(&status);
cfstatus = getcfstatus(status, pid);
printf("%-20s: %s", argv[i], cfstatus);
rem--;
i++;
}
}
最佳答案
按照目前的写法,其 PID 存储在 pids[i]
中的子进程将对 argv[i]
命名的文件进行操作。对此没有任何不确定性。 i
通过 fork
操作与其他所有内容一起被复制,此后不会被修改。
但是,因为所有子级并行运行,所以它们可能以任何顺序完成。也就是说,每次调用 wait
都可能返回数组中的任何 PID(尚未返回)。因此,您需要在 wait
循环中将 back 从 wait
返回的 pid 值映射到它在 中的索引pids
数组,然后你知道 argv
中正确的索引来打印出来。对于这样的程序,通过数组进行线性搜索可能就足够了。
关于c - 执行流程的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28533619/