执行流程的顺序
Order in which processes will be carried out
我对 C 还很陌生,如果这是一个简单的问题,我深表歉意。我正在写一个 C 程序,其中一部分如下。整个程序的目标是将文件从一个位置复制到另一个位置(文件作为参数传递,最后一个参数是目标)。下面的 main()
使用 fork()
为每个传递的文件创建一个子进程,我需要打印出文件名(只是输入参数)以及可能包含每个文件的 PID 的消息在所有子进程都具有 运行.
之后进行复制尝试
我显然可以获取和使用 PID,这不是问题,但我如何才能获取与该进程关联的正确文件 name/argument?我现在那里的方法显然是错误的;简单地按顺序遍历每个参数是不正确的。这将是 运行 在 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
可能 return 数组中的任何 PID(尚未 returned)。因此,您需要在 wait
循环中将 back 从由 wait
编辑的 pid 值 return 映射到其在 pids
数组,然后你知道 argv
中正确的索引打印出来。对于这样的程序,对数组进行线性搜索可能就足够了。
这一行('i'除外)有一些问题
"if(copyfile(argv[i], argv[argc - 1]) == 1)'
如果命令行是:
程序名 srcFile desFile
然后 argc = 3
然后argv[argc-1] = srcFile,这不是想要的
建议:
'if(copyfile(argv[i], argv[argc]) == 1)'
然后,在写入 output/desFile
时避免竞争条件
任何时候只有一个进程可以写入该文件。
所以分叉多个进程写入同一个文件是错误的
这一行:
'for(i = 0; i < argc; i++) {'
需要对(除其他事项外)进行一些修改
避免尝试将可执行文件复制到 desFile
并避免尝试将 desFile 复制到自身
建议:
'for(i = 1; i < (argc-1); i++) {'
我对 C 还很陌生,如果这是一个简单的问题,我深表歉意。我正在写一个 C 程序,其中一部分如下。整个程序的目标是将文件从一个位置复制到另一个位置(文件作为参数传递,最后一个参数是目标)。下面的 main()
使用 fork()
为每个传递的文件创建一个子进程,我需要打印出文件名(只是输入参数)以及可能包含每个文件的 PID 的消息在所有子进程都具有 运行.
我显然可以获取和使用 PID,这不是问题,但我如何才能获取与该进程关联的正确文件 name/argument?我现在那里的方法显然是错误的;简单地按顺序遍历每个参数是不正确的。这将是 运行 在 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
可能 return 数组中的任何 PID(尚未 returned)。因此,您需要在 wait
循环中将 back 从由 wait
编辑的 pid 值 return 映射到其在 pids
数组,然后你知道 argv
中正确的索引打印出来。对于这样的程序,对数组进行线性搜索可能就足够了。
这一行('i'除外)有一些问题
"if(copyfile(argv[i], argv[argc - 1]) == 1)'
如果命令行是: 程序名 srcFile desFile
然后 argc = 3 然后argv[argc-1] = srcFile,这不是想要的
建议:
'if(copyfile(argv[i], argv[argc]) == 1)'
然后,在写入 output/desFile
时避免竞争条件任何时候只有一个进程可以写入该文件。
所以分叉多个进程写入同一个文件是错误的
这一行:
'for(i = 0; i < argc; i++) {'
需要对(除其他事项外)进行一些修改 避免尝试将可执行文件复制到 desFile 并避免尝试将 desFile 复制到自身
建议:
'for(i = 1; i < (argc-1); i++) {'