将stdin / out重定向到管道并在子进程中使用

时间:2015-10-20 17:53:14

标签: c linux multithreading pipe

我正在编写一个简单的应用程序,该应用程序将使用匿名管道与使用execl()调用的子进程进行通信。 子进程是简单的回声应用。 我想将stdinstdout重定向到管道,并使用它们来接收父项中子项发送的数据。 现在只回显了两行。 有什么想法是错的吗?

这是我的代码: (parent.c)

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

int main()
{
int parent_to_child[2];
int child_to_parent[2];

if(pipe(parent_to_child) == -1) exit(-1);
if(pipe(child_to_parent) == -1) exit(-1);

switch(fork())
{
    case -1: exit(-1);

    case 0: //child
         if(close(0) == -1) exit(-1);
         if(dup(parent_to_child[0]) != 0) exit(-1);
             fprintf(stderr, "stdin changed\n");
         if(close(1) == -1) exit(-1);
         if(dup(child_to_parent[1]) != 1) exit(-1);
             fprintf(stderr, "stdout changed\n");
         close(parent_to_child[0]);
         close(parent_to_child[1]);
         close(child_to_parent[0]);
         close(child_to_parent[1]);

         execl("./child_process","child_process", (char*)NULL);
         exit(-1);
    default: //parent

         close(parent_to_child[0]);
         close(child_to_parent[1]);
         size_t size = 1024;
         char* line = (char *) malloc(size);
         while(getline(&line, &size, stdin) != -1)
         {
             if(write(parent_to_child[1], line, (strlen(line)+1)*sizeof(char)) == -1)
             {
                printf("%d", errno);
                exit(-1);
             }
             read(child_to_parent[0], line, size);
             printf("%s", line);
         }
}
return 0;
}

(child_process.c)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
size_t size = 1024;
char* line = (char*) malloc(size);

setlinebuf(stdout);
setlinebuf(stdin);
fprintf(stderr, "child started\n");
while(getline(&line, &size, stdin) != -1)
{
    printf("%s", line);
}
fprintf(stderr, "exiting");
free(line);
return 0;
}

0 个答案:

没有答案