进程间通信(IPC)的方式有哪些:
1.管道:有名管道,无名管道
2.信号量
3.共享内存
4.消息队列
5.套接字
每个进程是一个独立的个体
将a进程的数据拷贝到b进程的数据,可以通过设置一个文件作为中间文件,将a进程的数据写到文件中,再把文件中的数据读到b中,但是这种方法不太好,因为文件是在磁盘中存储的,I/O速度较慢,所以系统采用的方式不是这种
ps -ef | grep “bash”:中的 | 就是一个管道,grep是过滤的意思,只过滤有有"bash"内容的数据
mkfifo a:mkfifo是创建管道的命令,a是名字
注意:管道不能持久的存储数据
管道文件和文件不一样的地方:
1.两个进程必须同时打开,必须是一读一写才可以
2.用open打开管道,如果只有一个人打开open,那么就会阻塞
3.写入数据write 数据实际写到了内存中,而不是磁盘上,管道也是有大小的,如果管道满了,继续往里面写的话就会读阻塞
4.读管道 read 读是从内存中读,如果管道的数据为空,就会读阻塞
5.关闭管道close
演示通过有名管道让两个进程通讯
a.c的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
void fun(int sig)
{
printf("sig=%d\n",sig);
}
int main()
{
signal(SIGPIPE,fun);
int fd = open("fifo",O_WRONLY);
printf("fd=%d\n",fd);
while(1)
{
printf("input:\n");
char buff[128] = {0};
fgets(buff,128,stdin);
if(strncmp(buff,"end",3) == 0)
{
break;
}
write(fd,buff,strlen(buff));
}
close(fd);
}
b.c的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
int main()
{
int fd = open("fifo",O_RDONLY);
printf("fd=%d\n",fd);
while(1)
{
char buff[128] = {0};
int n = read(fd,buff,127);
if(n == 0)
{
break;
}
printf("n=%d,buff=%s\n",n,buff);
}
close(fd);
exit(0);
}
先运行a.c再运行b.c
先运行b.c再运行a.c
先终止b.c(读端),那么a.c(写端)会怎么样:进程会收到一个信号(13号信号SIGPIPE),将程序终止
代码:
管道是怎么存储数据的?
管道打开时会在内存中分配一块空间(划分成一个字节一个字节的),会有两个指针(头指针和尾指针,一开始都指向起始位置),当数据写入的时候,头指针会往后挪动(头指针始终指向要即将写入的地方),两个指针之间的距离就是数据的长度,当要读数据的时候,如果要读的内容小于两个指针的距离就可以读,读的时候尾指针往后挪,如果尾指针读读到头指针的位置了,说明管道读空了(所以管道空的时候,两个指针不一定在起始位置),如果写到管道最后了,就会从头开始继续写,如果写到尾指针的位置了,说明写满了,此时就不能继续写了
无名管道
无名管道相对来说容易一些
无名只能在父子进程间通信
无名管道:用pipe(int fd[])创建,一般来说,fd[0]是读端,fd[1]是写端
面试会问到的问题:
1.有名管道和无名管道的区别?
有名管道可以在任一两个进程间通信,无名管道只能用在父子进程
2.写入管道的数据存储在哪里?内存还是磁盘?
在内存中存储
3.管道的通讯方式是全双工还是半双工?
是半双工
什么是全双工、半双工、双工?
全双工(能同时发同时收):如打电话,既能说话也能听间别人说话
半双工(能发也能收,但是不能同时发同时收):如对讲机,能发也能收,但是不能同时发同时收
单工(只能收不能发):如收音机,数据流向是单项的,数据只能从一方流向另一方,而不能逆向流动
管道写端关闭,读端read的返回值等于0
管道读端关闭,写端write异常SIGPIPE
dup():复制文件描述符(文件描述符是文件表的下标),返回值就是新的描述符
dup2():????
文件描述符是文件表的下标,标准输入(0),标准输出(1),标准错误输出(2)
下一次课的内容:
查一下概念
信号量:
1.什么是信号量?
2.(面试)pv操作是什么?
3.临界区?
4.临界资源?
5.原子操作?