通过管道发送C命令行参数

时间:2013-10-01 19:36:47

标签: c pipe

我正在尝试使用管道从子进程向父进程发送命令行参数,但无法弄清楚我做错了什么。我的代码如下。任何帮助表示赞赏。提前谢谢。

int main(int argc, char argv[])
   pid_t child;
   int fd[2];

   pipe(fd);
   if((child = fork() == 0)
   {
      int len = strlen(argv[1]);
      close(fd[0];
      write(fd[1], argv[1], len);
      exit(0);
   }
   else //Assuming process won't fail for now
   {
      char src[10]; //Just using 10 for now, no arguments have more than 10 characters
      read(fd[0], src, (strlen(src)));
      fprintf(stderr, "%s\n", src);
      close(fd[0]);
   }
}

3 个答案:

答案 0 :(得分:2)

你有一些小错误,但据我所知,不管你信不信,这可能是你真正的问题。

read(fd[0], src, (strlen(src)));

我的猜测是第一个char为null,你正在成功读取0个字节。

更改为

  read(fd[0], src, (sizeof(src)));

在较大的项目中,请确保以循环方式读写。您无法保证读取或写入您指定的内容。

答案 1 :(得分:1)

您可能需要先关闭else块内的fd [1]。

检查此示例

#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
    int
    main(int argc, char *argv[])
    {
            int pipefd[2];
            pid_t cpid;
            char buf;
            if (argc != 2) {
            fprintf(stderr, "Usage: %s <string>\n", argv[0]);
            exit(EXIT_FAILURE);
            }
            if (pipe(pipefd) == -1) {
                    perror("pipe");
                    exit(EXIT_FAILURE);
            }
            cpid = fork();
            if (cpid == -1) {
                    perror("fork");
                    exit(EXIT_FAILURE);
            }
            if (cpid == 0) {    /* Child reads from pipe */
                    close(pipefd[1]);          /* Close unused write end */
                    while (read(pipefd[0], &buf, 1) > 0)
                            write(STDOUT_FILENO, &buf, 1);
                    write(STDOUT_FILENO, "\n", 1);
                    close(pipefd[0]);
                    _exit(EXIT_SUCCESS);
            } else {            /* Parent writes argv[1] to pipe */
                    close(pipefd[0]);          /* Close unused read end */
                    write(pipefd[1], argv[1], strlen(argv[1]));
                    close(pipefd[1]);          /* Reader will see EOF */
                    wait(NULL);                /* Wait for child */
                    exit(EXIT_SUCCESS);
            }
    }

答案 2 :(得分:0)

您认为fork()不会失败。

但是pipe() ??

怎么样?

假设两者都成功完成,然后重新正确关闭fds。

你的if-else块应该是这样的。

if((child = fork() == 0)
   {
      int len = strlen(argv[1]);
      close(fd[0]);//I assume this was your typo. otherwise it would not even get compiled
      write(fd[1], argv[1], len);
      close(fd[1]);
      exit(0);
   }
else //Assuming process won't fail for now
   {
      close(fd[1]);
      char src[10]; //Just using 10 for now, no arguments have more than 10 characters
      read(fd[0], src, (strlen(src)));
      fprintf(stderr, "%s\n", src);
      close(fd[0]);
   }