Linux在C中使用管道在父进程和子进程之间传递值? [英] Linux pass value between parent process and child process using pipe in c?

查看:102
本文介绍了Linux在C中使用管道在父进程和子进程之间传递值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

一个进程创建一个子进程,将x增加1,然后将x值发送给该子进程,然后该子进程可以将x乘以10,然后将x传递回父进程,依此类推.您至少应该这样做5次.

A Process creates a child process, increase x by 1, then send x value to the child process, the child process can then multiply x by 10, and pass x back to the parent process and so on. You should at least do this 5 times.

输出应如下所示:

初始值0

父母:

x运算后的值:1

孩子:

操作后的x值:10

父母:

x运算后的值:11

x value after operation:11

孩子:

操作后的x值:110

x value after operation:110

父母:

操作后的x值:111

x value after operation:111

孩子

操作后的x值:1110

x value after operation:1110

我所拥有的是以下.......

What i have is the following.......

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>

#define READ 0
#define WRITE 1

int main()
{
  pid_t pid;
  int mypipefd[2];
  int ret;
  int i;
  int x=0;
  int result,result2;

  ret = pipe(mypipefd);

  if(ret ==-1)                    //test for pipe
    {
      perror("pipe");             //show error and exit  
      exit(1);
    }

  printf("initial value %d\n", x);   

  pid = fork();

  for(i=0;i<5;i++)

{

  if(pid == 0)
    {
        /*Child process*/

  result2=result*10;
  write(mypipefd[WRITE],&result2,sizeof(result2));
  printf("Child:\nx value after operation: %d\n", x);
  close(mypipefd[WRITE]);
  read(mypipefd[READ],&result2,sizeof(result2));

  printf("=======================================\n");
  close(mypipefd[READ]);

}

  else if(pid > 0) 
{
   /*Parent process*/

 result=x++;
 write(mypipefd[READ],&result,sizeof(result));   
 printf("Parent:\nx value after operation: %d\n", x); 
 close(mypipefd[WRITE]);
 read(mypipefd[WRITE],&result,sizeof(result)); 

 printf("=======================================\n");
 close(mypipefd[READ]);
 exit(0);

}

 else
{
  perror("fork");
  exit(1);
    }

  }

}

问题是,我的代码有什么问题?我试图读取并写回管道,但似乎不起作用...

The question is, what's wrong with my code? I tried to READ and WRITE back the the pipe but seems not working...

我的代码现在输出是什么?

What's the output of my code right now:

初始值0

父母:

x运算后的值:1

孩子:

操作后的x值:0

孩子:

操作后的x值:0

孩子:

操作后的x值:0

孩子:

操作后的x值:0

孩子:

操作后的x值:0

推荐答案

我认为要解决的第一个问题是,当您尝试读取/写入数据时,管道的两端都打开了.如果您要将数据写入管道,则可以

I think the first issue to address is that you have both ends of the pipe open when you are trying to read/write data. If you are writing data to the pipe you would

close(fd[READ_END])
write(...)
close(fd[WRITE_END])

第二,unix中的管道是单工的.您似乎正在尝试同时读取和写入管道.如果要执行此操作,则必须打开两个管道.

Second, pipes in unix are simplex. You seem to be trying to read and write from the pipe at the same time. If you want to do this you are going to have to open two pipes.

我修改了程序,以向您展示如何从管道读取,然后为父/子管道写入管道.希望对您有帮助.

I modified your program to show you how to read from pipe and then write to pipe for parent/child. Hopefully this helps you.

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

#define BUFFER_SIZE 25
#define READ  0
#define WRITE 1

int main(void)
{
  pid_t pid;
  //open two pipes, one for each direction
  int mypipefd[2];
  int mypipefd2[2];

  /* create the pipe */
  if (pipe(mypipefd) == -1 || pipe(mypipefd2) == -1) {
    fprintf(stderr,"Pipe failed");
    return 1;
  }

  /* now fork a child process */
  pid = fork();

  if (pid < 0) {
    fprintf(stderr, "Fork failed");
    return 1;
  }

  if (pid > 0) {  /* parent process */  
    int writeValue=10;
    int readValue=0;
    close(mypipefd[READ]);      //close read end, write and then close write end
    write(mypipefd[WRITE],&writeValue,sizeof(writeValue));    //write to pipe one
    printf("Parent: writes value : %d\n", writeValue);
    close(mypipefd[WRITE]);
    close(mypipefd2[WRITE]);        //close write end, read, and then close read end
    read(mypipefd2[READ],&readValue,sizeof(readValue));
    printf("Parent: reads value : %d\n", readValue);
    close(mypipefd2[READ]);
  }
  else { /* child process */
    int writeValue=20;
    int readValue=0;
    close(mypipefd[WRITE]);   //close write end, read, and then close read end
    read(mypipefd[READ],&readValue,sizeof(readValue));
    printf("child: read value : %d\n", readValue);
    writeValue+=readValue;
    close(mypipefd[READ]);
    close(mypipefd2[READ]);       //close read end, write and then close write end
    write(mypipefd2[WRITE],&writeValue,sizeof(writeValue));
    printf("child: writeValue value : %d\n", writeValue);
    close(mypipefd2[WRITE]);

  }

  return 0;
}

这将打开两个管道.父级将一个值写入第一个管道,而子级则读取该值.子级更新此值,并将其写入第二方向管道.然后,父级读取此值,然后感到烦恼!双向管道通讯.

This open two pipes. The parent writes a value to the first pipe and the child reads this value. The child updates this values, and writes it to the second direction pipe. The parent then reads this value and vuela! two way pipe communication.

输出:

Parent: writes value : 10
child: read value : 10
child: write value : 30
Parent: reads value : 30

这可以扩展到您的应用程序

This can be extended to your application as such

 if (pid > 0) {  /* parent process */  
    result1++;
    close(mypipefd[READ]);      //close read end, write and then close write end
    write(mypipefd[WRITE],&result1,sizeof(result1));    //write to pipe one
    printf("Parent:\n x value after operation: %d\n", result1);
    close(mypipefd[WRITE]);
    close(mypipefd2[WRITE]);        //close write end, read, and then close read end
    read(mypipefd2[READ],&result1,sizeof(result1));
    close(mypipefd2[READ]);
  }
  else { /* child process */
    close(mypipefd[WRITE]);   //close write end, read, and then close read end
    read(mypipefd[READ],&result2,sizeof(result2));
    result2*=10;
    printf("child:\n x value after operation %d\n", result2);
    close(mypipefd[READ]);
    close(mypipefd2[READ]);       //close read end, write and then close write end
    write(mypipefd2[WRITE],&result2,sizeof(result2));
    close(mypipefd2[WRITE]);
  }

如果将其放入循环中,则理论上是可行的.但是,由于上下文切换和其他与OS相关的调度,执行顺序在两个进程之间会变得混乱.这意味着读写不一定按照您的方式进行,并且不会起作用.阅读这个问题 如何等待,直到数据写在管道的另一端.

If you put this in the loop then it would theoretically work. HOWEVER, The order of execution will be jumbled between the two processes due to context switching and other OS related scheduling. This means that reads and writes are not necessarily sequential the way you are doing it, And it wont work. Read into this question How to wait till data is written on the other end of pipe.

这篇关于Linux在C中使用管道在父进程和子进程之间传递值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆