计算Linux中父进程的最大数量

时间:2017-10-29 17:31:20

标签: c++ linux

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/resource.h>
#include <errno.h>
int main()
{
  int pid;
  int temp = 0;
  while(1){
  pid = fork();
  if(pid == 0)
     return 0;
   if(pid == -1){
      if (errno == EAGAIN)
      printf("%d \n limit process", (int)temp);
  exit(-1);}
  temp++;
  }
       return 0;
}

这是我的代码。但老师说这是不正确的,如果(pid == 0)条件正文有问题。请帮帮我。谢谢!

1 个答案:

答案 0 :(得分:0)

fork()为子流程返回0,为父流程返回>0,如果有错误则返回负值。

您的子进程立即完成,所以实际上您从未设法同时生成多个进程,因为它们是分叉完成的。

您要做的是让子进程保持运行,直到父进程告诉它关闭(例如通过信号)。

if (0 == pid) {
    // I am child process -> wait until signal
    // for example: sleep(MAX_INT);
}

并且在父进程中,您需要在测试完成时关闭所有子进程。例如,您可以将所有子进程放入一个进程组并向其发送信号:

  if (pid == -1) {
    if (errno == EAGAIN) {
      // print output
      printf("%d \n limit process", temp);
      // kill all child processes (you 
      kill(0, SIG_TERM); // you might need to set up signal handler in parent process too - see 'signal')
      // wait for child processes to finish and cleanup (we know there is 'temp' count of them);
      for (int = 0; i < temp; ++i) {
        wait(NULL);
      }
    }
  }

参考文献:

http://man7.org/linux/man-pages/man2/kill.2.html

http://man7.org/linux/man-pages/man2/waitpid.2.html

http://man7.org/linux/man-pages/man2/signal.2.html