【问题标题】:Read from pipe C从管道 C 读取
【发布时间】:2014-03-07 08:11:39
【问题描述】:

我需要创建一个新进程来运行 xxx 程序,加载 xxx 程序,发送“xxx”从管道读取的数据,但我收到此错误,“错误:无法从标准输入读取”我尝试编译。

pid_t pid;
pid = fork();
int fd[2]; 
int ret;

ret = pipe(fd); 

if (ret == -1)
{
    perror("pipe failed");
    exit(1);
}

if (pid == -1)
{
    perror("fork failed");
    exit(1);
}

else if (pid == 0) //Child
{
    char buff[10];
    int validate;
    close(fd[1]);
    dup2(fd[0], STDIN_FILENO); 
    close(fd[0]);
    read(STDIN_FILENO, buff, sizeof(buff)); 
    xxx = execlp("./xxx", "./xxx", NULL); //run xxx
    exit(validate);
}

else //Parent //WRITE STDIN TO PIPE
{
    close(fd[0]); 



    //writes data to pipe



    close(fd[1]);

我们将不胜感激!

【问题讨论】:

  • 如果您提供最少的可编译代码,您可以获得更多工程师的帮助。
  • 为什么在调用execlp 之前从管道中读取?这将导致被执行的程序跳过管道中的前 10 个字节。

标签: c pipe


【解决方案1】:

你需要在fork之前创建管道!

这是应该如何完成的代码+修复C pipe, fork, dup, and exec()

【讨论】:

    【解决方案2】:

    您能否详细说明您要做什么?这里的一件事是您在 fork 之后调用 pipe() 调用,导致父级和子级具有不同的文件描述符副本。您应该在 fork() 调用之前创建管道,以便两个进程共享管道。

    【讨论】:

      【解决方案3】:

      首先:你必须在fork之前调用pipe,否则进程之间将没有通信。

      其次:您在execlp 之前的read 没有任何意义,因为您没有在任何地方使用存储在buff 中的信息。您必须解释这一点才能获得更多帮助。

      在调用dup之前也要关闭标准输入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 2023-03-06
        • 2018-10-04
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        相关资源
        最近更新 更多