#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)条件正文有问题。请帮帮我。谢谢!
答案 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