c - 执行流程的顺序

标签 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++;
   }
}

最佳答案

按照目前的写法,其 PID 存储在 pids[i] 中的子进程将对 argv[i] 命名的文件进行操作。对此没有任何不确定性。 i 通过 fork 操作与其他所有内容一起被复制,此后不会被修改。

但是,因为所有子级并行运行,所以它们可能以任何顺序完成。也就是说,每次调用 wait 都可能返回数组中的任何 PID(尚未返回)。因此,您需要在 wait 循环中将 backwait 返回的 pid 值映射到它在 中的索引pids 数组,然后你知道 argv 中正确的索引来打印出来。对于这样的程序,通过数组进行线性搜索可能就足够了。

关于c - 执行流程的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28533619/

相关文章:

c - 当子进程执行 execvp 时,waitpid 未收到退出状态

c - 我们什么时候应该在 C 中使用断言?

c - 如何在数组中使用 C 字符串?

java - 如果父级不使用 Java 中的 stdout/stderr,为什么进程会挂起?

c# - c# 中有没有办法知道用户何时使用应用程序完成文件编辑?

c - 为什么系统调用位左移?

c - C : segmentation fault 中的 sizeof(数组)

c# - "Process.Close()"有必要吗?

c - Minix 3 stdio.h 无法识别文件 *f

c - 你如何在 Minix 的 EXEC 调用中释放父内存?