`
hulianwang2014
  • 浏览: 690436 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

Linux下的无名管道pipe的设计

 
阅读更多

1. 函数说明

pipe(建立管道):
1) 头文件 #include<unistd.h>
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 <unistd.h>
     3	#include <sys/types.h>
     4	#include <errno.h>
     5	#include <stdio.h>
     6	#include <string.h>
     7	#include <stdlib.h>
     8	#include <sys/wait.h>
     9	/*
    10	 * 程序入口
    11	 * */
    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 error\n");
    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 %s\n",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创建子进程,之后,子进程会拷贝父进程的代码段/数据段及堆栈段,因此,创建的管道会被复制一份,子进程一份,父进程一份,为了使管道正常通讯,必须处理已有管道。

分享到:
评论

相关推荐

    Linux下的无名管道pipe的设计.docx

    Linux下的无名管道pipe的设计.docx

    linux无名管道通信机制

    利用linux中的无名管道通信机制,编写一段C程序。在程序中建立一个全双工的通信管道,让父子进程通过管道完成信息交互。

    Linux管道详解-管道通信、无名管道、有名管道、具体应用示例

    无名管道(PIPE)是一种亲缘进程间的通信方法2.1 无名管道的通信原理无名管道存在于kernel中,A,B必须具有亲缘关系进程。同一时刻,只能有一个写端或一个读端。父子进程间,只要是fork()出来的,就会完美复制父...

    无名管道示例代码

    Linux系统编程——进程间通信:管道(pipe),相关教程链接如下: http://blog.csdn.net/tennysonsky/article/details/46315517

    进程的管道通信 实验报告

    和无名管道,还知道pipe文件的建立和读/写进程互斥。 2、熟悉UNIX/LINUX支持的管道通信方式。并在程序中运用了pipe( ) ; read( ); write( )等系统调用。 3、在程序中sleep(5);的作用是让所显示的内容休眠5秒钟,...

    linux网络编程全套代码

    无名管道 pipe: 亲缘进程, 两个文件描述符, 有名管道 fifo: 信号 signal: void fun(int sig); signal() 注册信号处理函数; IPC: 共享内存shm:最快!!!指针访问 消息队列msg:消息类型 信号灯集sem_arr...

    7_pipe_signal.rar

    linux c 源码 有名管道 无名管道 信号 定时器

    Linux进程间通讯

    IPC基本概念,无名管道(pipe)概念与编程,有名管道(fifo)概念与编程,信号概念与编程,定时器

    linux进程之间的通讯综合实例.zip_Linux共享内存_TCP/IP_message_pipe/fifo_shm

    A&lt;========&gt;B&lt;=========&gt;C&lt;=====&gt;D&lt;======&gt;E A与B进程之间通过TCP的socket传递 主要掌握socket的流程: ...D跟E之间使用无名管道进行交互 E程序中可以使用有名管道 进行通讯。

    Linux系统编程第05期:进程间通信

    无名管道PIPE? ? 命名管道FIFO? ? 消息队列? ? 共享内存? ? 信号量? ? 文件锁? ? 信号signal....其中还包括system V和POSIX 两种接口标准,除此之外,Linux系统自身还扩展了自己的一套API接口用于进程间通信,比如...

    操作系统实验

    子进程Pi分别向管道各写信息,而父进程则从管道中读出来自于各子进程的信息,实现进程家族间无名管道通讯。 扩展之,使之成为客户/服务器模式,并完成一定的任务(自己定义)。 (2)命名管道通信:利用mkfifo(name,...

Global site tag (gtag.js) - Google Analytics