进程间通讯摘录(1)-----无名管道
进程间通讯包括有名管道,无名管道,消息队列,信号,共享内存,套接字。
有名管道与无名管道:前者允许无亲缘关系的进程间通信,管道存在于文件系统中,后者存在于内核中。
消息队列:与队列不同的是消息队列每次可以从队列中取同一类型的数据,而不是一个数据。消息队列克服了管道通信与信号通的信息量有限的缺点。
信号:在软件层次上对中断的一种模拟。
共享内存:最有效的进程间通信的方式,使得多个进程访问同一块内存空间,共享更新。但该通信方式依赖同步机制,如互斥锁和信号量。
信号量:进程之间或同一进程不同线程之间的同步或互斥的手段。
套接字:用于网络中不同机器之间。
无名管道代码示例:
创建管道------父进程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);
}
}
浙公网安备 33010602011771号