执行流程的顺序

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++) {'