2015-09-15 53 views
2

我有这段代码,它的目标是创建N个子进程并打印出每个PID和进程号。分叉后退出子进程

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

void childProcess(int num) 
{ 
    pid_t pid = fork(); 

    printf("Hello! I am process no. %d! my PID is %d!\n", num, pid); 
} 

int main() 
{ 
    int i = 0; 

    for(i = 1; i <= 5; i++) 
    { 
     childProcess(i); 
     _exit(3); 
    } 
    exit(0); 
} 

但是尝试多种方法后:e.g退出VS _exit,递归的子进程,PID = wait()的,我仍然无法顺利建立仅5进程。有了这段代码到目前为止我的输出是

Hello! I am process no. 1! my PID is 96196! 
Hello! I am process no. 1! my PID is 0! 

我不知道如何正确退出子进程。没有退出代码创建N!流程。

感谢你的帮助,

+1

当你说你要创建“N子进程”,什么是“N”?它是for循环中的迭代器值吗? – northsideknight

回答

0

fork()将您的过程分为两个过程,一个父母和孩子。您需要在childProcess()内对其返回值进行某种测试,以确定您是否在父母或孩子身上。如果pid是0,那么你在孩子身上;如果非零,那么你在父母。根据你的想法有条件地退出程序。

+0

这很有趣,所以如果你不介意我问,每当我改变我的childProcess包含一个if语句,以便只在pid!= 0时运行,正在打印的pid加1. 为什么是if那是父母? – TrevTS

+0

'fork()'的返回值是什么?检查文档。这不是当前进程的PID。 –

2

您正确退出子进程,只是您在错误的时间执行此操作。在fork()之后,每个子进程都保持与父进程一样的循环,创建另一个子进程,这就是为什么你最终拥有大量进程的原因。

正确的代码会是这样的:

for (int i = 0; i < 5; i++) { 
    if (fork() == 0) { 
    // child process 
    printf("I'm child %d, my pid is %d\n", i, getpid()); 
    exit(0); 
    } 
    // parent process keeps running the loop 
}