Linux 进程间通讯之创建无名管道和读写无名管道

2014-11-24 08:52:01 来源: 作者: 浏览: 0

Linux进程间通讯的方式:


1. 管道(pipe)和有名管道(FIFO).
2. 信号(signal)
3. 消息队列
4. 共享内存
5. 信号量
6. 套接字(socket)


管道通讯:


无名管道:由pipe()函数创建,int pipe(int filedis[2]), 当管道建立时有两个文件描述符,filedis[0]用于读管道,filedis[1]用于写管道。关闭管道,仅需将两个文件描述符关闭即可。


创建无名管道pipe():


#include


#include



int main(){


intpipe_filed[2];


if(pipe(pipe_filed)<0){


printf("pipecreate failed.\n");


return-1;


}


else{


printf("pipecreate successfully.\n");


close(pipe_filed[0]); //关闭相应读管道(必须要)


close(pipe_filed[1]); //关闭相应写管道(必须要)


}


}


注:fork()必须在pipe()之前来创建子进程,否则子进程无法进程相应的文件描述符,如果在fork之后,那么fork会在子/父进程各执行一次,属不同的管道。


读写无名管道示例:


#include


#include


#include


#include



int main(){


charcache[100];


intfiledis[2];


if(pipe(filedis)< 0){


printf("Createpipe failed.\n");


return-1;


}


memset(cache,0, sizeof(cache)); //在一段内存块中填充某个特定的值,此为,对cache数组以0进行填充



intpid;


pid= fork(); // 创建子进程


if(pid== 0){ // 进入子进程


printf("Inchild process.\n");


close(filedis[1]); // 关闭写管道


sleep(3); // 等待,为了等父进程写入东西


read(filedis[0],cache, 100); // 读管道,并将内容写入cache之中


printf("%s.\n",cache); // 打印cache内容


close(filedis[0]); // 关闭读管道


}


elseif(pid > 0){ // 进入父进程


printf("Inparent process.\n");


close(filedis[0]); // 关闭读管道


write(filedis[1],"Hello ",6); // 第一次写入


write(filedis[1],"linuxdba", 8); // 第二次写入


close(filedis[1]); // 关闭写管道


wait(NULL); // 等待子进程退出再往下执行


}


else{


printf("Createchild process failed.\n");


return-1;


}


return0;


}


-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: