我对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++;
}
}
答案 0 :(得分:1)
按照当前的说法,PID存储在pids[i]
中的子进程将对argv[i]
命名的文件进行操作。对此没有任何不确定性。 i
操作会将fork
与其他所有内容重复,之后不会进行修改。
但是,由于所有孩子并行运行,他们可能会以任何顺序完成。也就是说,每次调用wait
都可能返回数组中的任何PID(尚未返回)。因此,您需要在wait
循环中执行的操作是将返回从wait
返回的pid值映射到pids
数组中的索引,然后你知道argv
中正确的索引要打印出来。对于这样的程序,通过数组进行线性搜索可能已经足够了。
答案 1 :(得分:0)
这一行(除了&#39; i&#39;一定不能为0)有一些问题
"if(copyfile(argv[i], argv[argc - 1]) == 1)'
如果命令行是: programname srcFile desFile
然后argc = 3 那么argv [argc-1] = srcFile,这不是想要的东西
建议:
'if(copyfile(argv[i], argv[argc]) == 1)'
然后,为了避免写入输出/ desFile中的竞争条件
任何时候只有一个进程可以写入该文件。
因此要求将大量进程写入同一文件是一个错误
这一行:
'for(i = 0; i < argc; i++) {'
需要对(除其他事项外)进行一些修改 避免尝试将可执行文件复制到desFile 并避免尝试将desFile复制到自身
建议:
'for(i = 1; i < (argc-1); i++) {'