找出进程数

时间:2017-06-27 20:55:55

标签: c unix process pipe fork

我有一个简单的管道程序,它创建子进程以便写入一些信息,父进程将显示此信息。

int main() {
   int pfd[2], i, n;
   pipe(pfd);
   for(i=0; i<3; i++) {
     if(fork() == 0) {
        write(pfd[1], &i, sizeof(int));
        close(pfd[0]); close(pfd[1]);
        exit(0);
     }
     else {

     }
   }
   for(i=0; i<3; i++) {
      wait(0);
      read(pfd[0], &n, sizeof(int));
      printf("%d\n", n);
   }
   close(pfd[0]); close(pfd[1]);
   return 0;
}

在这种情况下,父进程将收到以下结果:0 ,1 and 2

如果删除包含exit(0)的行,如何找出程序创建的进程数?

提前致谢。

1 个答案:

答案 0 :(得分:1)

下面是一个跟踪创建子项数的工作示例。请注意,fork()将创建另一个地址空间,该空间不允许您在父/子之间共享变量。但程序计数器将保持不变,因此父母和孩子将在调用fork()后立即执行。

如果你在一个循环中做fork(),你的孩子将到达身体的末端,如果它通过了它将执行身体的条件(再次包括fork())。

#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>



int main() {
   int pfd[2], i, n;
   pid_t children_pids[3];
   int children_created = 0;
   memset(children_pids, 0, sizeof(children_pids));

   pipe(pfd);
   for(i=0; i<3; i++) {
     pid_t p = fork();
     if(p == 0) {
        write(pfd[1], &i, sizeof(int));
        close(pfd[0]); close(pfd[1]);
        exit(0);
//      break;
     }
     else {
        children_pids[children_created++] = p;
     }
   }
   for(i=0; i<3; i++) {
      pid_t p = waitpid(children_pids[i], NULL, 0);
      if (p == -1) {
          /* error, but expected w/o exit() above */ 
          continue;
      }
      read(pfd[0], &n, sizeof(int));
      printf("%d\n", n);
   }
   close(pfd[0]); close(pfd[1]);

   printf("Total children: %d\n", children_created);
   return 0;
}