ZheCi 发表于 2022-4-20 18:25

通过管道将父进程的标准输出作为子进程的标准输入

我试图通过管道将父进程的标准输出作为子进程的标准输入,但是子进程并不能通过管道读取到数据?
代码:
int main(void)
{
      int fd;
      pid_t pid;

      if(pipe(fd) < 0) //创建管道
      {
                perror("pipe error");
                exit(-1);
      }

      if((pid = fork()) < 0)// 创建子进程
      {
                exit(-1);
      }
      else if(pid == 0)
      {
                //puts("child start");
                char buf = {0};

                close(fd);
                dup2(fd, 0);//将管道的读端,作为标准输入
                close(fd);
            
                gets(buf);//从标准输入中读取数据,存放在buf,相当于从fd读数据存放在buf中
                puts(buf);//打印读取的数据
                //puts("child end");
      }
      else
      {
                //puts("parent start");
                close(fd);
                write(fd, "123", 4);//往管道的写端,写入数据
                wait(NULL);
      }

      return 0;
}

运行结果阻塞!在子进程gets(buf)处!有前辈直到这个问题吗?

A学习的小菜鸟 发表于 2022-4-24 10:48

你遇到进程的死锁了,具体一点就是看看进行管理原理,你也就明白了,简单点就是代码虽然是逻辑运行,但是进程在系统中不是按照顺序进行运行的,所以出现一个进程同时抢夺资源,或者同时想让资源的情况,建议加上信号量试试

ZheCi 发表于 2022-5-13 10:15

A学习的小菜鸟 发表于 2022-4-24 10:48
你遇到进程的死锁了,具体一点就是看看进行管理原理,你也就明白了,简单点就是代码虽然是逻辑运行,但是进 ...

是gets的问题,gets需要接受'\n'才能正常返回!将write(fd, "123", 4);语句换成write(fd, "123\n", 4);可正常解决!
页: [1]
查看完整版本: 通过管道将父进程的标准输出作为子进程的标准输入