欢迎来到山村网

Linux下的无名管道pipe的设计

2019-03-09 12:30:12浏览:244 来源:山村网   
核心摘要:  1. 函数说明  pipe(建立管道):  1) 头文件 #include  2) 定义函数: int pipe(int filedes[2]);  3) 函数说明: pi

  1. 函数说明

  pipe(建立管道):

  1) 头文件 #include

  2) 定义函数: int pipe(int filedes[2]);

  3) 函数说明: pipe()会建立管道,并将文件描述词由参数filedes数组返回。

  filedes[0]为管道里的读取端

  filedes[1]则为管道的写入端。

  4) 返回值: 若成功则返回零,否则返回-1,错误原因存于errno中。

  错误代码:

  EMFILE 进程已用完文件描述词最大量

  ENFILE 系统已无文件描述词可用。

  EFAULT 参数 filedes 数组地址不合法。

  示例:

  root@wl-MS-7673:/home/wl/桌面/c++# cat -n pipe_test.cpp

  1

  2 #include

  3 #include

  4 #include

  5 #include

  6 #include

  7 #include

  8 #include

  9

  12 int main()

  13 {

  14 int pipe_fd[2];

  15 pid_t pid;

  16 char buf_r[100];

  17 char* p_wbuf;

  18 int r_num;

  19

  20 memset(buf_r,0,sizeof(buf_r));

  21

  22

  23 if(pipe(pipe_fd)<0)

  24 {

  25 printf("pipe create errorn");

  26 return -1;

  27 }

  28

  29

  30 if((pid=fork())==0) //子进程执行序列

  31 {

  32 printf("n");

  33 close(pipe_fd[1]);//子进程先关闭了管道的写端

  34 sleep(2);

  35 if((r_num=read(pipe_fd[0],buf_r,100))>0)

  36 {

  37 printf("%d numbers read from the pipe is %sn",r_num,buf_r);

  38 }

  39 close(pipe_fd[0]);

  40 exit(0);

  41 }

  42 else if(pid>0) //父进程执行序列

  43 {

  44 close(pipe_fd[0]); //父进程先关闭了管道的读端

  45 if(write(pipe_fd[1],"Hello",5)!=-1)

  46 printf("parent write1 Hello!n");

  47 if(write(pipe_fd[1]," Pipe",5)!=-1)

  48 printf("parent write2 Pipe!n");

  49 close(pipe_fd[1]);

  50 wait(NULL);

  51 exit(0);

  52 }

  53 return 0;

  54 }

  55

  56

  root@wl-MS-7673:/home/wl/桌面/c++# g++ pipe_test.cpp -o pipe_test

  root@wl-MS-7673:/home/wl/桌面/c++# ./pipe_test

  parent write1 Hello!

  parent write2 Pipe!

  10 numbers read from the pipe is Hello Pipe

  root@wl-MS-7673:/home/wl/桌面/c++#

  无名管道的创建是在fork创建前,通过pipe()创建管道,然后通过fork创建子进程,之后,子进程会拷贝父进程的代码段/数据段及堆栈段,因此,创建的管道会被复制一份,子进程一份,父进程一份,为了使管道正常通讯,必须处理已有管道。

(责任编辑:豆豆)
下一篇:

iOS利用AVPlayer播放网络音乐的方法

上一篇:

Java 异步编程实践

  • 信息二维码

    手机看新闻

  • 分享到
打赏
免责声明
• 
本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们 xfptx@outlook.com