linux匿名信号量,【Linux学习笔记】----进程间通信(管道(命名管道,匿名管道)、共享内存、消息队列、信号量机制)...

1.管道

管道

本质:管道是内核中的一块缓冲区,用于实现进程间的通信

通信过程需要用户态到内核态,再到用户态的情况。

特性:

(1).半双工通信方式,(可双向传递数据,同一时刻只能单向)

(2).生命周期随进程,进程退出,管道释放。

(3).以只读方式打开会阻塞,直到文件以写的方式打开,以只写的方式打开会阻塞,直到文件以读的方式打开。

(4).如果没有数据,读会阻塞,如果数据慢了写操作会阻塞,管道大小(64k)

(5).当所有读端被关闭时,(父子进程),写端会阻塞,当所有写端被关闭时,读端读完数据,读端会返回0

(6).管道操作,不限制进程数量,一个管道可以被多个进程访问。(同步与互斥保证安全性)

(7).字节流服务,数据读完就拿走了。

(8).自带同步与互斥

互斥:同一时间,临界资源只能被一个进程访问,其他的加入阻塞队列中。

同步:管道满了,写端阻塞,直到读端将所有数据读走,管道中没数据读端会阻塞,直到写入新的数据,

匿名管道

(1).特点

用于实现具有亲缘关系的进程间通信,要在fork之前创建管道,不然不能操作管道。

(2).接口

int pipefd[2]={-1 }

pipefd[0]----读

pipefd[1]----写

int fd = pipe(pipefd[ ])

返回值:成功返回文件操作句柄,失败返回-1。

操作:获取文件操作句柄之后,然后进行读写操作。

命名管道

(1).特点

用于实现同一主机任意进程间通信,通过命名管道文件实现通信。

(2).接口

mkfifo test.fifo创建命名管道文件,文件名最前面有p的文件类型表示。

int fd = mkfifo(char* filename,mode_t mode)

mkfifo ("./test.fifo",0664)

管道文件名,操作权限

创建完成,用open打开,其余操作和文件操作类似。

2.共享内存

创建共享内存

int shmget(KEY,size, shmflg)

参数:内核中共享内存标识,内存页大小(4096),权限设置(IPC_CREAT,IPC_EXCL | 0664)

返回值:成功返回非负数操作句柄,失败返回-1

建立映射关系

void* shmat(shmid,buf,shmflg)

参数:操作句柄,共享内存首地址(通常置NULL),操作权限(SHM_RDONLY,只读,0可读可写)

返回值:成功返回首地址指针,失败返回(void*)-1

操作共享内存

解除映射关系

int shmdt(buf)

参数:共享内存首地址

返回值:成功返回0,失败返回-1

删除共享内存

int shmct (shmid,IPC_RMID,NULL)

参数:共享内存操作句柄,对共享内存的操作(IPC_RMID),获取或设置共享内存信息结构(NULL)

返回值:成功返回0,失败返回-1

特点

删除共享内存并不会立即删除,而是将其状态设置为销毁状态,为的是不让其被其他进程继续映射链接,直到链接数为0时,才删除这块共享内存。

共享内存操作的是首地址,所以写入的时候是覆盖式写入,同时也没有自带同步与互斥,存在安全性问题(需要加锁保证安全)并且当写端关闭时,读端读取出来的是最后一次写入的数据。

生命周期随内核,进程退出时,不会释放该空间,关机才会释放,是一种最快的通信方式,本质原理是操作同一块物理内存,避免内核态和用户态的切换。

hello world+1

hello world+2

hello world+3

hello world+4

hello world+5

hello world+6

hello world+7

hello world+8

hello world+9

hello world+10

hello world+10

hello world+10

hello world+10

3.消息队列

消息队列

消息队列是内核中一个优先级队列,通过多个进程访问一个队列,进行添加或获取节点进行通信。

接口

创建优先级队列

int msgget(key_t key,int msgflg)

参数:标识符,权限。

返回值:成功返回操作句柄,失败返回-1;

向发送消息

int msgsnd(int msqid,const void* msgp,size_t msgsz, int msgflg)

参数:操作句柄,指向结构体的指针,大小,操作权限

从队列接收

ssize_t msgrcv(int msqid, void msgp, size_t msgsz, long msgtyp,int msgflg);

参数:操作句柄,指向结构体的指针,大小,类型,操作权限

删除优先级队列int msgctl(int msqid,int cmd,struct msqid_dsbuf)

参数:操作句柄,操作权限,用于获取或设置优先级队列信息

返回值:成功返回0,失败返回-1

struct msgbuf {

long mtype; /* message type, must be > 0 */

char mtext[1]; /* message data */

};

4.信号量机制

1.信号量是实现进程间的同步与互斥

互斥:同一时间,只有一个进程能访问临界资源。

同步:能访问就访问,不能访问就加入等待队列。

临界资源:一次仅允许一个进程使用的共享资源。

临界区:临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段。

实现过程:计数器+等待队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值