进程间通信方式

本文详细介绍了进程间通信的多种方式,包括无名管道和有名管道的使用,信号的处理方法,如何通过共享内存进行快速数据交换,以及消息队列的工作原理和操作。此外,还提到了信号量在进程同步和资源保护中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

管道:有名管道和无名管道

单向的,先进先出。写进程在管道尾部写入,读进程在管道头部读出数据

当数据被一个进程读出后,将被从队列中删除

 

若进程试图读空管道时,进程将堵塞

 

无名管道:

只能由父子进程使用

创建:int pipe(int fd[2])

fd[1]用于写管道,fd[0]用于读管道

 

注:必须在调用fork()之前调用pipe(),否则子进程将不会继承文件描述符

 

有名管道:不相关的进程也能交换数据

创建:int mkfifo(char *pathname,mode_t mode)

一旦创建FIFO,就可用open打开,closereadwrite等都可以作用于FIFO

unlink()  删除数据

 

信号:

常见信号:SIGKILL,SIGSTOP,SIGCHILD,SIGTERM

 

信号处理:

忽略此信号:SIGKILL,SIGSTOP绝不能被忽略,它们向超级用户提供终止或停止进程的方法;

执行用户希望的操作;

执行系统默认的操作

 

发送信号的函数有:kill,raise

区别:raise 向自身进程发送信号;

          kill可以向自身或其他进程发送信号

int kill(pid,signo)

int raise(sign)

 

alarm(int seconds) 每个进程只能有一个闹钟时间

 

信号处理主要方法:使用简单的signal函数;使用信号集函数组

signal(int signum,void (*func)(int))

 

共享内存

进程间共享数据最快的方法

共享内存实现:

创建:使用shmget

映射:将共享内存映射到具体的内存空间上,使用shmat

 

将共享内存从进程地址空间脱离:int shmdt(char *shmaddr)

 

消息队列:

消息队列就是消息的链表

进程可以添加新纪录,另一些进程可以从消息队列中读出信息

成功读取了一条消息后,队列中这条消息将被删除

系统V队列:只有在内核重启或人工删除时,该队列才被删除

 

创建:int msgget(key,msgflg)

返回消息队列描述字

发送消息:int msgsnd(int msqid,struct msgbuf *msgp,int msgsz,int flag)

接收消息:int msgrcv(int msqid,struct msgbuf *,int msgsz,long msgtype,int flag)

msqid代表的消息队列中读取一个msgtype型消息,把消息存储在struct msgbuf结构中

 

信号量:

保护临界资源

用于访问控制,进程同步

 

分类:二值信号灯,计数信号灯

创建:semget

信号量处理:semctl(semid, 1,SETVAL,union_sem)

semctl(semid,0,RMID)

 

ipcs 查看共享内存,消息队列

ipcs -q   直接查看消息队列

ipcrm -q 序号    删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值