Linux 下进程通信称为IPC,共有如下几种方式:
半双工管道(无名管道)
FIFO(有名管道)
消息队列
信号量
共享内存
半双工管道通信(无名管道)适用于父子进程等有亲缘关系的进程通信。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
/*
在进程用无名管道进行通信时,需要分别管掉两个进程的读和写端,譬如进程1向进程2发消息,
则进程1关闭读端,进程2关闭写端---无名管道是半双工的。
用例操作父进程向子进程发消息
*/
int main(int argc,char*argv[])
{
int ret=-1;
int fd[2] ; //创建两个管道文件描述符,用于两进程使用。
int nread,nwrite;
pid_t pid; //用于存放进程id;
int *write_fd=&fd[1]; //fd[1]端是文件描述符写端
int *read_fd=&fd[0] ; //fd[0] 端是文件描述符读端
char message[]="你好,子进程,我是你爸爸"; //要发送的消息
char recvbuf[1024]; //用于缓存收到的消息。
ret=pipe(fd); //创建无名管道
if(ret==-1)
{
perror("pipe");
exit(-1);
}
pid=fork(); //创建进程
if(pid ==-1)
{
perror("pid");
exit(-1);
}
else if(pid==0)
{
close(*write_fd);
nread=read(*read_fd,recvbuf,sizeof(recvbuf));
recvbuf[nread]='\0';
printf("child recev:%d is %s\n",nread,recvbuf);
return 0;
}
else
{
close(*read_fd);
nwrite=write(*write_fd,message,strlen(message));
printf("father send :%d\n",nwrite);
return 0;
}
return 0;
}
运行结果:
zdg@ubuntu:/mnt/hgfs/SHARE/4.程序进线程$ ./a.out
father send :36
zdg@ubuntu:/mnt/hgfs/SHARE/4.程序进线程$ child recev:36 is 你好,子进程,我是你爸爸