Linux的IPC机制细节

1、无名管道(int pipe(int fd[2]))管道缓冲区一有空闲区域,写进程就会写。如果读进程不读出的话,操作会阻塞。如果没有内容的话,读进程也会被阻塞(读写用read和write)
2、标准流管道(FILE * popen(const char cmd ,cconst char type))创建连接到另外一个进程的管道。也就是一个可以执行别的操作的可执行文件***。(类似的还有system和exec函数族,提供了在一个程序里面执行别的文件的方法),读写必须使用标准流操作(gets和puts)
3、有名管道(int mkfifo(const char * filename,mode_t mode)).可以使用阻塞打开和非阻塞打开。和之前的无名管道的最大区别。
****无名和有名,有不同的使用场合,并不存在谁好谁坏,标准流管道执行的命令产生的输出,是否必须要读过来才能使用?。使用exec执行的命令,或许可以直接在终端打印
4、信号 是Linux里面唯一的可以实现异步通知的机制,这个机制类似于中断,是非常有价值的。每个信号都有默认操作。这些默认操作,可能会让进程中,pause()后面的函数不执行。但是如果自己覆盖默认函数,就会执行。使用信号最大的
好处是:节约CPU资源,等待过程中,CPU会自动运行别的程序。不需要阻塞或者非阻塞轮询或者poll机制。
kill(pid_t pid ,int sig)用于发送信号(其他进程),raise()用于向自身发送信号。alarm()也用于向自己发送信号。前两者发送任意信号。alarm只能发送SIGALRM。
接收到信号如何处理?signal()和singaction()。前者直接对某个信号给出一个处理函数。后者会使用一个集合,针对一系列信号。注意后者针对每一个信号都有特定的处理方式由sigaction结构体表示。里面包含着处理函数,mask,标志位。这个mask会指定哪些信号会被当前进程接收,哪些不会。
5、信号量(semget() semctl() semop()),P操作会阻塞等待在某个地方。没有得到信号,后面的程序都无法执行。信号量主要用来同步。
6、共享内存(函数:shmget() shmat() shmdt()),主要用来传递大数据,需要经历创建,映射等操作,映射返回会得到一个段地址。对这个段地址读写。读写方法可能需要注意。需要用到strcnpy这种内存复制函数。普通的读,写函数应该不可以。
7、消息队列(msgget() msgsnd() msgrcv() msgcntl()),类似于ucos中的邮箱,与FIFO不同的是,可以读取指定消息(但是ucos的邮箱不可以,邮箱更像是传递单条消息,传递多条由消息队列)。看起来Linux里面的消息队列就是ucos里面的消息队列+邮箱。
##上面的5 6 7 点,创建和使用都有类似的地方。其实,这些东西只是用的话,套路都一样。只是使用的场合不同。最重要的一点,如果进程想使用这些机制,那进程一定会用某种方法令自己
一直执行*,或许是while(1)循环,1 2 3 5 6 7点,或许是用pause(信号专属)。不用担心这个进程一直执行之后,别的程序无法执行,操作系统会调度多个执行的进程。这是它自动执行的。我们需要做的,就是,运行多个进程。简单点,跑起来就完事了,剩下的操作系统解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值