应用程序开发第四天进程间通信(国嵌笔记)

1.进程间通信概述
为什么进程间需要通信?
1.数据传输(一个进程需要将它的数据发送给另一个进程)
2.资源共享(多个进程间共享同样的资源)
3.通知事件(一个进程需要向另一个或一组进程发送消息,通知他们发生了某种事件)
4.进程控制(有些进程希望完全控制另一个进程的执行,如Debug进程,此时控制进程希望能够拦截另一个进程的所有操作,并能够及时通知它的状态改变)
现在Linux使用的进程间通信方式包括:
1.管道(pipe)和有名管道(FIFO)
2.信号(signal)
3.消息队列
4.共享内存
5.信号量
6.套接字(socket)
2.管道通信
管道是单向的、先进先出的,他把一个进程的输入和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。
数据被一个进程读出后,将被从管道中删除。提供了简单的流控制机制,读空管道写满管道进程将阻塞。

分为有名管道和无名管道,前者用于父进程和子进程间的通信,后者可运用于同一系统中任意两进程的通信
1.无名管道
int pipe(int filedis[2]);
当一个管道建立时,他会创建两个文件描述符:filedis[0]用于读管道filedis[1]用于写管道。把这两个当作文件。
关闭管道只需要将这两个文件描述符关闭即可,可以使用close逐个关闭
2.管道读写
管道通常用于不同进程间通信。通常先创建一个管道,再通过fork函数创建一个子进程,该子进程将会继承父进程所创建的管道
注意:必须在调用fork之前调用pipe,否则子进程将不会继承文件描述符(原因fork之后会创建两个管道)




注意:由于fork函数让子进程完整的拷贝了父进程的整个地址空间,所以父子进程都有管道的读端和写端。我们往往希望父子进程中的一个进程写一个进程读,那么写的进程最好关掉读端,读的进程最好关闭写端。
3.有名管道
1.
#include<sys/types.h> #include <sys/stat.h>
int mkfifo(const char* pathname,mode_t mode)
pathname:FIFO文件名 mode属性。
一旦创建了一个FIFO,就可用open打开它,一般的文件访问函数(close,read,write等)都可用于FIFO
2.操作
当打开FIFO时,非阻塞标志(O_NONBLOCK)将对以后的读写产生如下影响:
1.没有使用O_NONBLOCK:访问要求无法满足时进程将阻塞。如试图读取空的FIFO,将导致进程阻塞。
2.使用O_NONBLOCK:访问要求无法满足时不阻塞,立即出错返回,errno是ENXIO。
读取一次之后管道的数据就会清除
3.信号通讯
  信号(signal)kill函数或命令传递信号
信号类型
信号处理:
1.忽略此信号:大多数是这样处理的,但SIGKILL和SIGSTOP不能忽略
2.执行用户希望的动作
3.执行系统默认动作
发送信号
kill和raise函数
区别:kill既可以向自身发送信号,也可以向其他进程发送信号。raise是像进程自身发送信号

#include<sys/types.h>
#include<signal.h>

int kill(pid_t pid,int signo)
int raise(int signo)
Alarm
使用alarm函数可以设置一个时间值(闹钟时间),当所设置的时间到了时,产生SIGALRM信号。如果不捕捉此信号,则默认动作是终止该进程。
#include<unistd.h>
unsigned int alarm(insigned int seconds)
经过seconds秒后会产生SIGALRM信号
Pause
pause函数使调用该进程挂起直至捕捉到一个信号
#include<unistd.h>
int pause(void);
只有执行了一个信号处理函数后,挂起才结束
信号处理:1.使用简单的signal函数2.使用信号集函数组
#include<signal.h>
void (*signal(int signo,void (*func)(int)))(int)
typedef void (*sighandler_t)(int)
sighandler_t signal(int signo,sighandler_t handler)

func可能的值:
 SIG_IGN:忽略此信号
 SIG_DFL:按照系统默认方式处理
 信号处理函数名:使用该函数处理


void myfunc(int sig_no)
{
if(sig_no==SIGBUS)
···
}


signal(SIGBUS,myfunc);
pause();
exit(0);


kill -BUS pid   //执行此命令向pid进程发送SIGBUS信号
eg:事例源代码
4.内存共享(访问快,不需要额外的操作)详查此用法,还不会用呢!!!!!!
共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进 程就可以立刻看到其中的内容。
1.共享内存使用方法与步骤
1.创建共享内存,使用shmget函数
2.映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数
2.创建
int shmget(key_t key,int size,int shmflg)
成功返回共享内存标识符,失败返回-1
3.映射
int shmat(int shmid,char *shmaddr,int flag)
4.解除映射
int shmdt(char *shmaddr)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值