c - 如何将文件内容写入管道?

标签 c

我有这个代码:

            close(pipefd[0]);

            fp = fopen(argv[1], "r");

            if(fp)
            {
                while((c = getc(fp)) != EOF)
                {
                    if((write(pipefd[1], c, 1)) < 1)
                    {
                        fprintf(stderr, "Write to pipe failed.\n");
                        exit(EXIT_FAILURE);
                    }
                }
            }

            fclose(fp);

            close(pipefd[1]);   
            waitpid(childPID, &status, 0);
            exit(EXIT_SUCCESS);

据我了解,应该打开一个文件并将其内容写入管道。然后,这将成为另一个程序的标准输入。我的测试表明,除了写入之外,一切正常,但我不知道为什么它不工作。

我只是做了一些愚蠢的事情吗?

编辑: 是的,我做了一些愚蠢的事情。

我认为问题出在我的写入上(在我修复了 c 需要为 &c 之后),但它实际上是在我的子进程中,我在其中使用 dup2() 将管道的读取端链接到的标准输入我的子进程。我的论点是倒退的。这是从 fork() 开始的工作代码:

childPID = fork();
if (childPID == 0)
{
    //child code
    //printf("In the child process.\n");
    dup2(pipefd[0], STDIN_FILENO);
    close(pipefd[1]);

    execv(argv[2], paramList);
    printf("You shouldn't be seeing this.\n");
}
else
{
    //parent code
    //printf("In the parent process\n");
    close(pipefd[0]);

    fp = fopen(argv[1], "r");

    if(fp)
    {
        while((c = getc(fp)) != EOF)
        {
            if((write(pipefd[1], &c, 1)) < 1)
            {
                fprintf(stderr, "Write to pipe failed.\n");
                perror("write");
                exit(EXIT_FAILURE);
            }
        }
    }

    fclose(fp);

    close(pipefd[1]);   
    waitpid(childPID, &status, 0);
    exit(EXIT_SUCCESS);
}

希望这可以帮助其他人四天之内不必用头撞 table !并感谢所有及时回答的人。

最佳答案

write() 接受一个指向要写入的数据缓冲区的指针,而不是一个字符(本质上是一个数字)。

答案很简单,不是将c传递给write(),而是传递c的地址,即。 &c

关于c - 如何将文件内容写入管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10769824/

相关文章:

c - 为什么我得到这个错误的输出?

c - 如何给空数组赋值

java - 在 C 中使用 JNI 未定义 CallXXXMethod

c - "The GNU C Programming Tutorial"错误

控制台立即消失

c - 定义数组时出错,即使它是通过常量设置的

c - 使用中间格式的最简单方法

android - OpenGL-ES Android : function pointers esUtil. h

c - 警报处理程序中 swapcontext 后的段错误

c++ - 辅助库可以用于在不相关的进程(不是 fork 进程)之间共享接受的连接吗?