进程间的通信机制

进程间的通信:
1、管道
2、信号量
3、共享内存
4、消息队列
5、套接字(socket)
6、条件变量

进程复制:fork()函数,子进程复制父进程的数据空间,堆栈的复制品。创建一个两个返回值,父进程返回子进程id,子进程返回0;

system()函数调用shell的外部命令在当前进程中开始另一个进程。

exec()族函数会用更新进程代替原有的进程,新进程PID和原进程相同。
在当前系统的可执行路径中根据指定的文件名找到合适的可执行文件名,并用来取代调用进程内容,即在原来进程内部运行一个可执行文件。
程序运行成功不返回,失败返回-1。

命名管道
和普通管道不同之处:
在文件系统中命名管道是以设备特殊文件的形式存在的。
不同进程可以通过命名管道共享数据。

消息队列
消息队列是内核地址空间中的内部链表,通过linux内核在各个进程之间传送内容,每个消息队列可以用IPC标识符唯一的进程确认,不同消息队列之间相互独立,每个消息队列中的消息,又构成一个独立的链表。

信号量(sem)

信号量是计数器,用来控制对多个进程共享的资源锁进行的访问,某个进程在对特定资源进行操作时,信号量可以防止另一个进程去访问它。
新建信号量函数semget()

int semget(key_t key,int nsems,int semflg);

创建一个新的信号量或获取一个已经存在的信号量的键值。
nsems表示初始化信号量的个数;

信号量操作函数semop()
信号量的P、V操作是通过向已经建立好的信号量(使用semget()函数),发送semop()命令来完成的。用户通过semop()改变信号量的值。也就是使用资源还是释放资源使用权。

short sem_op;
short sem_flg;

sem_op:如果其值为正数,该值会加到现有的信号内含值中。通常用于释放所控制资源的使用权;如果sem_op的值为负数,而其绝对值又大于信号的现值,操作将会阻塞,知道信号值大于或等于sem_op的绝对值。通常用于获取资源的使用权;如果sem_op的值为0,则操作将会暂时阻塞,直到信号的值变为0。
sem_flg可取的值如下:
IPC_NOWAIT:对信号的操作不能满足时,semop()不会阻塞,并立即返回,同时设定错误信息。
IPC_UNDO:程序结束时(不论正常或不正常),保证信号值会被重设为semop()调用前的值。这样做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定。

信号量控制函数semctl()
在这个函数中我们可以删除信号量或初始化信号量。

共享内存
共享内存是在多个进程之间共享内存区域的一种进程间的通信方式。它是在多个进程间对内存段进行映射的方式实现共享内存的。
shmget():创建共享内存函数
映射共享内存地址函数shmat();
删除内存共享函数shmdt();
共享内存控制函数shmctl();

信号signal()
用于截取系统的信号,对此信号挂接用户自己的处理函数。

PV原子操作:
P操作:
如果有可用的资源(信号量值>0),则此操作所在的进程占用一个资源(此时信号量值减一,进入临界区代码);
如果没有有用的资源(信号量值=0),则此操作所在的进程被阻塞直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)
V操作:
如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程;如果没有进程在等待它,则释放一个资源(即信号量值加1)。

发布了39 篇原创文章 · 获赞 10 · 访问量 750

猜你喜欢

转载自blog.csdn.net/weixin_43393776/article/details/100654936