创建一个n个子流程链

时间:2017-02-17 07:12:13

标签: c linux fork systems-programming

在c ++中创建n个进程的链,其中n为输入,进程的输出应为parent1-> child1(parent2) - > child2(parent3),通过使用递归函数我能够生成输出但是无法退出循环我还需要帮助发送循环应该中断的n的输入。

下面是我的代码:

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

int foo(const char *whoami) {
    printf("I am a %s.  My pid is:%d  my ppid is %d\n", whoami, getpid(), getppid() );
    return 1;
}

int func() {
    pid_t pid=fork();
    if (pid==0) { /* only execute this if child */
        foo("child");
        pid_t pid=fork();
        if (pid==0) { /* only execute this if child */
            foo("child");
            func();
            exit(0);
        }
      }
      exit(0);
    }
    wait(0);  /* only the parent waits */
    return 0;     
}

int main(void){
    foo("parent");
    func(); 
    return 0;
}

2 个答案:

答案 0 :(得分:1)

由于一个简单的原因,你不能退出循环,也就是说,你无休止地生成子进程。每当fork()新进程启动时,它就会再次分叉。

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

int n=5;

int foo(const char *whoami) {
    printf("I am a %s.  My pid is:%d  my ppid is %d\n", whoami, getpid(), getppid() );
    return 1;
}

int func(int n) 
{
    if (n == 0)
    { 
        return 0;
    }
    int pid = fork(); 
    if (pid == -1) {
        exit(0);
    }
    if (pid==0) { 
        foo("child");
        n = n-1;
        func(n);
        exit(0);
    }
    else {
       wait(NULL);
    } 
    return 0;   
}


int main()
{
    func(n); 
    return 0;
}

gcc -std=c99 prog.c -o prog

./prog

<强>输出:

I am a child. My pid is: 1159 my ppid is 1158
I am a child. My pid is: 1160 my ppid is 1159
I am a child. My pid is: 1161 my ppid is 1160
I am a child. My pid is: 1162 my ppid is 1161
I am a child. My pid is: 1163 my ppid is 1162

答案 1 :(得分:0)

根据您的说法我明白您遇到以下问题:

第一。您正在尝试发送数据&#39;从一个过程到另一个过程

第二。您正在尝试找到阻止程序运行的方法。

现在是第一个。如果你想这样做并且我理解正确,有两种方法可以实现这一点。一种是使用共享内存,另一种是使用管道。共享内存在做什么上非常明显。管道正在处理流程的stdout,并在下一个流程中将其重定向为stdin

现在您需要关闭程序。子进程在执行命令(exec)时或执行命令时执行(例如使用IF语句和返回)。您可以创建自己喜欢的语句,当子进程满足您的要求时,您可以使其死亡(还有一种方法可以使用kill(pid, SIGKILL);命令从子进程中终止父进程。

我没有为您提供任何代码,因为我不清楚问题的确切性质。 希望我的假设让你有所作为!