C管道到另一个程序的STDIN

时间:2013-11-25 08:25:57

标签: c pipe

我几乎无法理解管道的手册页,所以我需要帮助理解如何在外部可执行文件中获取管道输入。

我有两个程序: main.o &的 log.o

我写了 main.o 到fork。这是它正在做的事情:

  • 父叉管道数据发送给孩子
  • 子叉 exec log.o

我需要使用子fork for main来管道到 log.o

的STDIN

log.o 只需要STDIN&带有时间戳记的日志。

我的代码是由我不记得的各种StackOverflow页面中的一些代码组成的。管道的手册页:

printf("\n> ");
while(fgets(input, MAXINPUTLINE, stdin)){
   char buf;
   int fd[2], num, status;
   if(pipe(fd)){
      perror("Pipe broke, dood");
      return 111;
   }
   switch(fork()){
   case -1:
      perror("Fork is sad fais");
      return 111;

   case 0: // Child
      close(fd[1]); // Close unused write end
      while (read(fd[0], &buf, 1) > 0) write(STDOUT_FILENO, &buf, 1);

      write(STDOUT_FILENO, "\n", 1);
      close(fd[0]);
      execlp("./log", "log", "log.txt", 0); // This is where I am confused
      _exit(EXIT_FAILURE);

   default: // Parent
      data=stuff_happens_here();
      close(fd[0]); // Close unused read end
      write(fd[1], data, strlen(data));
      close(fd[1]); // Reader will see EOF
      wait(NULL); // Wait for child
   }
   printf("\n> ");
}

3 个答案:

答案 0 :(得分:6)

我可以建议一种更简单的方法。有一个名为popen()的函数。它与system()函数非常相似,除了您可以读取或写入子stdin/stdout之外。

示例:

int main(int argc, char* argv[])
{
    FILE* fChild = popen("logApp.exe", "wb"); // the logger app is another application
    if (NULL == fChild) return -1;

    fprintf(fChild, "Hello world!\n");

    pclose(fChild);
}

在控制台中输入“ man popen ”以获取完整说明。

答案 1 :(得分:5)

我想这就是你要做的事情:
1.主叉,父通过管道传递给孩子的消息 2.子接收来自管道的消息,将消息重定向到STDIN,执行日志 3.记录来自STDIN的消息,做一些事情。

执行此操作的关键是dup2将文件描述符从管道重定向到STDIN。

这是修改过的简单版本:

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

int main(int argc, char *argv[]) {
    int fd[2];
    char buf[] = "HELLO WORLD!";
    if(pipe(fd)){
      perror("pipe");
      return -1;
    }
    switch(fork()){
        case -1:
            perror("fork");
            return -1;
        case 0:
            // child
            close(fd[1]);
            dup2(fd[0], STDIN_FILENO);
            close(fd[0]);
            execl("./log", NULL);
        default:
            // parent
            close(fd[0]);
            write(fd[1], buf, sizeof(buf));
            close(fd[1]);
            wait(NULL);
    }
    printf("END~\n");
    return 0;
}  

答案 2 :(得分:0)