2012-03-06 47 views
2

我正在编写一个程序,将最终用于有一个子进程通过管道发送随机生成的字符到另一个子进程转换为大写值和输出,但在我得到远,我试图创建子进程并做出一些预期的输出。我写了下面的程序:创建新进程并期待输出

#include <stdio.h> /* printf, stderr, fprintf */ 
#include <sys/types.h> /* pid_t */ 
#include <unistd.h> /* fork */ 
#include <stdlib.h> /* _exit */ 
#include <errno.h> /* errno */ 

int main() 
{ 
    pid_t writer; 
    pid_t reader; 

    writer = fork(); 
    if (writer == -1) 
    { 
     fprintf(stderr, "can't fork, error %d\n", errno); 
     exit(1); 
    } 

    if (writer == 0) 
    { 
     printf("Writer process created.\n"); 
     reader = fork(); 
     if (reader == -1) 
     { 
      fprintf(stderr, "can't fork, error %d\n", errno); 
      exit(1); 
     } 

     if (reader == 0) 
     { 
      printf("Reader process created.\n"); 
      kill(reader); 
      printf("Reader was successfully murdered.\n"); 
     } 
     kill(writer); 
    } 
    wait(); 
    printf("Writer killed.\n"); 
    return 0; 
} 

我会非常喜欢的输出出来,如下:

Writer process created. 
Reader process created. 
Reader was successfully murdered. 
Writer killed. 

但由于这一点,它输出:

Writer process created. 
Reader process created. 
Reader was successfully murdered. 
Writer killed. 
Writer killed. 
Writer killed. 

就好像它正在经历父进程的代码的整个迭代,以及从它们被创建的点开始的两个子进程,这也导致我相信它们没有被杀死t我想要他们的适当时间。有人能指出我正确的方向吗?

+0

我喜欢你的字符串。尽管最后一行可能更有创意:'printf(“在苏联俄罗斯,程序终止你。\ n”);返回0;'。 – 2012-03-06 23:03:02

+1

你确定你想要:if(reader == 0){kill(reader); ...}(kill(0);)? – ebutusov 2012-03-06 23:07:42

+0

@muntoo哈哈 - 我喜欢你的建议,我想我会使用xD – RedMageKnight 2012-03-06 23:09:36

回答

0

这是你的充满工作示例与管道(也同步过程,所以你不必杀死他们)。记住,读者进程正在读取非常低效(由1个字符 - 我会离开它作为一个练习了:))

#include <stdio.h> /* printf, stderr, fprintf */ 
#include <sys/types.h> /* pid_t */ 
#include <unistd.h> /* fork */ 
#include <stdlib.h> /* _exit */ 
#include <errno.h> /* errno */ 
#include <string.h> /* strlen */ 

int main() 
{ 
    pid_t writer; 
    pid_t reader; 
    char buf; 
    int pipefd[2] = {-1,-1}; 
    const char* pcszTextToChild = "Text sent to child"; 

    writer = fork(); 
    if (writer == -1) 
    { 
     fprintf(stderr, "can't fork, error %d\n", errno); 
     exit(1); 
    } 

    if (writer == 0) 
    {/* writer process */ 
     printf("Writer process created.\n"); 
     if(pipe(pipefd) == -1) 
     { 
      perror("pipe"); 
      exit(EXIT_FAILURE); 
     } 
     reader = fork(); 
     if (reader == -1) 
     { 
      fprintf(stderr, "can't fork, error %d\n", errno); 
      exit(1); 
     } 

     if (reader == 0) 
     {/* reader process */ 
      close(pipefd[1]); /* Close unused write end */ 
      printf("Reader process created.\n\tReading: "); 
      fflush(stdout); 
      while (read(pipefd[0], &buf, 1) > 0) 
       write(STDOUT_FILENO, &buf, 1); 
      write(STDOUT_FILENO, "\n", 1); 
      close(pipefd[0]); 
      printf("Exiting reader process.\n"); 
      exit(EXIT_SUCCESS); 
     } 
     else 
     {/* writer process */ 
      close(pipefd[0]);   /* Close unused read end */ 
      write(pipefd[1], pcszTextToChild, strlen(pcszTextToChild)); 
      close(pipefd[1]);   /* Reader will see EOF */ 
      wait(NULL);    /* Wait for child */ 
      printf("Exiting writer process.\n"); 
      exit(EXIT_SUCCESS); 
     } 
    } 
    wait(); 
    return 0; 
} 

结果:

Writer process created. 
Reader process created. 
    Reading: Text sent to child 
Exiting reader process. 
Exiting writer process. 
0

你不杀任何东西。有很多编译器错误,你设法躲闪,所以 我添加了一些头文件,并在kill()和wait()中留下错误。还要考虑捕捉返回码并关注它们。有了正确的标题和/或错误陷阱,您就可以在早期看到您的问题。尝试编译,看看为什么事情没有做你想做的。修复错误,事情会改善。

#include <sys/types.h> /* pid_t */ 
#include <sys/wait.h> 
#include <stdio.h> /* printf, stderr, fprintf */ 
#include <unistd.h> /* fork */ 
#include <stdlib.h> /* _exit */ 
#include <errno.h> /* errno */ 
#include <signal.h> 

int main() 
{ 
    pid_t writer; 
    pid_t reader; 

    writer = fork(); 
    if (writer == -1) 
    { 
     fprintf(stderr, "can't fork, error %d\n", errno); 
     exit(1); 
    } 

    if (writer == 0) 
    { 
     printf("Writer process created.\n"); 
     reader = fork(); 
     if (reader == -1) 
     { 
      fprintf(stderr, "can't fork, error %d\n", errno); 
      exit(1); 
     } 

     if (reader == 0) 
     { 
      printf("Reader process created.\n"); 
      kill(reader); 
      printf("Reader was successfully murdered.\n"); 
     } 
     kill(writer); 
    } 
    wait(); 
    printf("Writer killed.\n"); 
    return 0; 
}