进程间通讯摘录(1)-----无名管道
2014-03-29 12:57
218 查看
进程间通讯包括有名管道,无名管道,消息队列,信号,共享内存,套接字。
有名管道与无名管道:前者允许无亲缘关系的进程间通信,管道存在于文件系统中,后者存在于内核中。
消息队列:与队列不同的是消息队列每次可以从队列中取同一类型的数据,而不是一个数据。消息队列克服了管道通信与信号通的信息量有限的缺点。
信号:在软件层次上对中断的一种模拟。
共享内存:最有效的进程间通信的方式,使得多个进程访问同一块内存空间,共享更新。但该通信方式依赖同步机制,如互斥锁和信号量。
信号量:进程之间或同一进程不同线程之间的同步或互斥的手段。
套接字:用于网络中不同机器之间。
无名管道代码示例:
创建管道------父进程fork(创建子进程)------关闭父进程的读和子进程的写描述符————读写
#include <unistd.h>
#include <sys/type.h>
#include <error.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_DATA_LEN 256
#define DELAY_TIME 1 //父子程序分别延时等待对方关闭读写字符
int main()
{
pid_t pid;
int pipe_fd[2];
char buf[MAX_DATA_LEN];
const char data[]="Pipe Test Program";
int real_read,real_write; //接收读写成功后返回的字节数,打印出来
memset((void*)buf,0,sizeof(buf));
if(pipe(pipe_fd)<0)
{
printf("pipe creat error !\n");
exit(1);
}
if((pid=fork())==0) //子进程读管道数据
{
close(pipe_fd[1]); //关闭写描述符
sleep(DELAY_TIME*3); // 延时等待父进程关闭读描述符
if((real_read=read(pipe_fd[0],buf,MAX_DATA_LEN))>0) // 读入buffer,成功后接受读字节数
{
printf("%d bytes read from the pipe is '%s'\n",real_read,buf); //打印字节数和读入内容
}
close(pipe_fd[0]);
exit (0);
}
else if(pid>0)
{
close(pipe_fd[0]);
sleep(DELAY_TIME);
if((real_write=write(pipe_fd[1],data,strlen(data)))!=-1)
{
printf("Parent wrote %d bytes :'%s'\n",real_write,data);
}
close(pipe_fd[1]);
waitpid(pid,NULL,0); //接收子进程退出时状态并收尸
exit(0);
}
}
有名管道与无名管道:前者允许无亲缘关系的进程间通信,管道存在于文件系统中,后者存在于内核中。
消息队列:与队列不同的是消息队列每次可以从队列中取同一类型的数据,而不是一个数据。消息队列克服了管道通信与信号通的信息量有限的缺点。
信号:在软件层次上对中断的一种模拟。
共享内存:最有效的进程间通信的方式,使得多个进程访问同一块内存空间,共享更新。但该通信方式依赖同步机制,如互斥锁和信号量。
信号量:进程之间或同一进程不同线程之间的同步或互斥的手段。
套接字:用于网络中不同机器之间。
无名管道代码示例:
创建管道------父进程fork(创建子进程)------关闭父进程的读和子进程的写描述符————读写
#include <unistd.h>
#include <sys/type.h>
#include <error.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_DATA_LEN 256
#define DELAY_TIME 1 //父子程序分别延时等待对方关闭读写字符
int main()
{
pid_t pid;
int pipe_fd[2];
char buf[MAX_DATA_LEN];
const char data[]="Pipe Test Program";
int real_read,real_write; //接收读写成功后返回的字节数,打印出来
memset((void*)buf,0,sizeof(buf));
if(pipe(pipe_fd)<0)
{
printf("pipe creat error !\n");
exit(1);
}
if((pid=fork())==0) //子进程读管道数据
{
close(pipe_fd[1]); //关闭写描述符
sleep(DELAY_TIME*3); // 延时等待父进程关闭读描述符
if((real_read=read(pipe_fd[0],buf,MAX_DATA_LEN))>0) // 读入buffer,成功后接受读字节数
{
printf("%d bytes read from the pipe is '%s'\n",real_read,buf); //打印字节数和读入内容
}
close(pipe_fd[0]);
exit (0);
}
else if(pid>0)
{
close(pipe_fd[0]);
sleep(DELAY_TIME);
if((real_write=write(pipe_fd[1],data,strlen(data)))!=-1)
{
printf("Parent wrote %d bytes :'%s'\n",real_write,data);
}
close(pipe_fd[1]);
waitpid(pid,NULL,0); //接收子进程退出时状态并收尸
exit(0);
}
}
相关文章推荐
- 高薪就业必备10】final修饰的变量,是引用不能变,还是对像..
- tomcat下配置https环境
- PS算法:正片疊底/溶解/柔光/差值/滤色
- 素数打表
- WPF窗体程序入口 自定义窗体启动页面
- [2014.3.29]poj2299 Ultra-QuickSort 解题报告(C++)
- jquery选择器操作二
- 如何通过调节gamma曲线以调节图像的对比度,亮度等参数
- 校赛预选赛
- 怎么解决每次打开Office 2013都提示配置进度
- mongodb从备份中恢复数据
- Shader Model 3 Using Vertex Texture
- 【高薪就业必备09】 HR问你,你在之前公司税后工资是多少?
- MersenneTwister算法
- linux errno定义
- Eclipse和Pydev鼓捣笔记
- 08 在ubuntu中截图的方法
- 远程桌面协议(RDP)工具 FreeRDP
- 伪随机数
- 6. web前端开发分享-css,js移动篇