进程通信

通讯的目的:
1,数据传输
2,资源共享
3,通知事件
4,进程控制
进程间通讯的方式:
1,管道pipe和有名管道fifo
2,信号
3,信号量
4,共享内存
5,套接字
6,消息队列


管道通讯
管道是单向的,先进先出的。
管道包括无名管道与有名管道,前者用于子进程与父进程进行通信,后者用于系统任意两个进程之间的通信。
Pipe函数创建无名管道:
intpipe(int filedis[2])
当一个管道创立是,他会建立两个文件描述符,filedis【0】用于读管道,filedis【1】用于写管道。
关闭管道时,只需逐个关闭这两个文件描述符即可。
 
无名管道的读写:
先创建一个管道,然后调用fork(),关闭不需要的文件描述符(确保先进先出的特性),然后向filedis[1]里写数据,从filedis[0]里读数据,注意进程间的协作(wiatpid(),sleep()的运用)。


命名管道:任意两进程的通信。
创建:
intmkfifo(const char* pathname,mode_t mode)


pathname为fifo名,mode为标致(O_NONBLOCK)
然后在不同进程中对pathname进行读写即可。。。。


信号通讯


产生信号:kill函数,键盘,硬件,kill命令
信号处理:
1,除了SIGKILL和SIGSTOP,其余的信号均可忽略。
2,执行用户指定的操作。
3,执行系统默认的动作。


信号发送:
两个函数:kill和raise
区别:kill既可以给自身发信号,也可以向其他进程发信号。Raise只能给自身发信号。
Intkill(pid_t pid,int signo)
intraise(int signo)


alarm函数:
使用alarm函数设定一个时间值,届时将产生SIGALRM信号。如果不捕捉此信号,默作是
终止次进程。


#include<unistd.h>
unsignedint alarm(unsigned int seconds)
seconed指定seconed秒后生信号SIGALRM。
Pause函数是调用进程等待直到捕捉到某个信号。
#include<unistd.h>
intpause(void)


信号的处理:
信号的处理有两种,一种是简单的用signal函数,一种是使用信号函数集。


Signal:
#include<signal.h>
void(*signal(intsigno,void (*func)(int)))(int)


共享内存
 多个进程共享一块内存,特点:速度快,不许要气他函数(如read,write等)。
步骤:
1,创建共享内存,shmget()函数。
  Intshmget(key_t key,int size,int shmflg)
如果key取值为IPC_PRIVATE,则创建一块信内存;当key取值为0且shmflg又设置为IPC_PRIVATE,同样会创建一块新内存。。


返回值:创建成功则返回共享内存标识符,失败则返回-1.


2,映射
intshmat(int shmid,char* shmaddr,ing flg)
shimid:shmget返回的共享内存标识符。
Flag:决定以什么方式来确定映射的地址。


返回值:成功则返回共享内存映射到进程中的地址,失败则返回-1.


回收:
intshmdt(int * shmaddr)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值