进程间通信的方式:
(1)管道:一种两个进程间进行单向通信的机制,半双工的通信方式。数据只能单方向流动,
而且只能在具有亲缘关系(父子进程、兄弟进程)的进程间使用。
从通信的双方信息交互的方式分三种基本模式:
单工通信(单向通信) 只有一个方向的通信而没有反方向的交互(信息流是单方向的),发送端和接收端的身份是固定的;
半双工通信(双向交替通信)双方均可以发送、接收信息,但是同一时刻里,信息只能有一个传输方向;
全双工通信(双向同时通信) 双方可以同时发送和接收信息。
(2)有名管道:(FIFO)半双工的通信方式,克服了只能有亲缘关系的进程通信的限制。(3)信号量;4)消息队列;(5)信号(chapter 9);(6)共享内存;7)套接字。
关于父子进程间的管道建立,想必大家都是了解的,但是实际应用中,我们并不这样去建立,
我们一般是建立FIFO的管道通信,这样有利于维护和进程间限制。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
int main()
{
char buff[1024]={0};
int fd;
if(mkfifo("fifo",0777))
{
perror("mkfifo error");
}
fd=open("fifo",O_WRONLY);
if(fd<0)
{
perror("open error");
}
printf("All ready,please enter:\n");
while(fgets(buff,sizeof(buff)-1,stdin)!=NULL)
{
write(fd,buff,strlen(buff));
memset(buff,0,sizeof(buff));
}
close(fd);
return 0;
}
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char buff[1024]={0};
int fd;
int ret,count;
fd=open("fifo",O_RDONLY);
if(fd<0)
{
perror("open error");
}
while(1)
{
count=0;
while(count<(sizeof(buff)-1))
{
ret=read(fd,buff+count,1);
if(ret < 1)
{
printf("exit\n");
close(fd);
unlink("fifo");
exit(0);
}
if(buff[count] == '\n')
break;
count++;
}
printf("recrive message:%s",buff);
memset(buff,0,sizeof(buff));
}
return 0;
}
程序运行结果如下: