2015-09-28 64 views
0

试图编写一个使用管道/ fork来创建/管理1个父进程和4个子进程的简单程序。父进程应该像这样显示主菜单。用fork()使用1个管道设置四个进程

Main Menu: 
1. Display children states 
2. Kill a child 
3. Signal a child 
4. Reap a child 
5. Kill and reap all children 

我正在写的代码应该创建4个子进程。我不确定是否正确设置了四个子进程。我知道fork向子代返回0,向父代返回PID。如何访问这些PID值的父项?我到底在哪里设置了父进程的菜单?

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

#define BUFSIZE 1024 
#define KIDS 4 
main() 
{ 
    //create unnamed pipe 
    int fd[2]; 
    char buf[BUFSIZE]; 

    if (pipe(fd) < 0) 
    { 
     perror("pipe failed"); 
     exit (1); 
    } 

    //array of child pids 
    size_t child_pid[4]; 

    //create 4 proccesses 
    int i = 0; 
    for (i = 0; i < KIDS; i++) { 
     child_pid[i] = fork(); 
     if (child_pid[i]) { 
      continue; 
     } else if (child_pid[i] == 0) { 
      close(fd[0]); 
      printf("Child %d: pid: %zu", i+1, child_pid[i]); 
      break; 
     } else { 
      printf("fork error\n"); 
      exit(1); 
     } 

    } 

} 

我的输出是:

Child 1: pid: 0 
Child 2: pid: 0 
Child 3: pid: 0 
Child 4: pid: 0 
+0

有没有错误?它循环多少次?这是在哪里宣布“PID”? – artsylar

+1

对不起,我在那个循环周围改变了很多,我搞砸了,它应该是child_pid [i]。我正在编辑输出中。 – tdwig

+0

'printf(“Child%d:pid:%zu”,i + 1,child_pid [i]);'工作得很好。它只在'child_pid [i] == 0'时执行,这正是它所做的(即它打印一个零)。错误在你的概念中。 – sokin

回答

0

我不确定如果我正确设置四个子进程。

右键,你不应该让孩子摆脱他们的代码块,所以更改

  break; 

  sleep(99); // or whatever you want the child to do 
      exit(0); 

如何访问父...?

getppid(),如果由于某种原因您需要它。

我到底在哪里设置了父进程的菜单?

做那种事main结束前for循环之后,这也正是家长继续执行。