订单将在哪些流程中执行

时间:2015-02-16 02:16:31

标签: c process minix

我对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++;
   }
}

2 个答案:

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