进程通信

信号通讯

信号(signal)机制是Unix系统中最为古老的进程间通信机制,很多条件可以产生一个信号:

1)当用户按某些按键时,产生信号。

2)硬件异常产生信号:

除数为0、无效的存储访问等等。这些情况通常由硬件检测到,将其通知内核,然后内核产生适当的信号通知进程。

例如:

内核正访问一个无效存储区的进程产生一个SIGSEGV信号。

3)进程用kill函数将信号发送给另一个进程。

4)用户可以用kill命令将信号发送给其他进程。

2、信号类型

1)SIGHUP      2)SIGINT     3)SIGQUIT      4)SIGILL

5)SIGTRAP      6)SIGIOT     7)SIGBUS       8)SIGFPE

9)SIGKILL      10)SIGUSR1   11)SIGSEGV     12)SIGUSER2

13)SIGPIPE     14)SIGALRM   15)SIGTERM     17)SIGCHLD

18)SIGCONT     19)SIGSTOP   20)SIGTSTP     21)SIGTTIN 

22)SIGTTOU     23)SIGURG    24)SIGXCPU     25)SIGXFSZ

26)SIGVTALRM   27)SIGPROF   28)SIGWINCH    29)SIGIO

30)SIGPWR

下面是几种常见的信号:

△:SIGHUP:从终端上发出的结束信号

△:SIGINT:来自键盘的中断信号(Ctrl-C)

△:SIGKILL:该信号结束接收信号的进程

△:SIGTERM:kill命令发出的信号

△:SIGCHLD:标识子进程停止或结束的信号

△:SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止直行信号

3、信号处理

当某信号出现时,将按照下列三种方式中的以一种进行处理:

1、忽略此信号

大多数信号都按照这种方式进行处理,但有两种信号绝对不会忽略。

它们是:

SIGKILL和SIGSTOP。

不能忽略的原因是:它们向超级用户提供了一种终止或停止进程的方法。

2、执行用户希望的动作

通知内核在某种信号发生时,调用一个用户函数。

在用户函数中,执行用户希望的处理。

3、执行系统默认动作

对大多数信号的系统默认的动作是终止该进程。

4、信号发送

发送信号的主要函数有kill和raise

区别:

kill既可以由自身发送信号,也可以向其它进程发送信号。

与kill函数不同的是,raise函数是向进程自身发送信号。

#include <sys/types.h>

#include <signal.h>
int kill(pid_t pid,int signo)

int raise(int signo)

注意:

kill的pid参数有四种不同的情况:

1)pid>0

将信号发送给进程ID为pid的进程。

2)pid==0

将信号发送给同组的进程。

3)pid<0

将信号发送给其进程组ID等于pid绝对值的进程。

4)pid==-1

将信号发送给所有进程。

5、alarm

使用alarm函数可以设置一个时间值(闹钟时间),当所设置的时间到了时,产生

SIGALARM信号。

如果不捕捉此信号,此默认动作是终止该进程。

#include <unistd.h>

unsigned int alarm(unsigned int seconds)

△:seconds:

经过了指定的seconds秒后产生信号SIGALRM。

△:每个进程只能有一个闹钟时间。

如果在调用alarm时,以前已为该进程设置过闹钟时间,而且它还没有超时,以前登记的闹钟时间则被

更新替换。

△:如果有以前登记的尚未超过的闹钟时间,而这次seconds值是0,则表示取消以前的闹钟。

6、pause

pause函数使调用进程挂起直至捕捉到一个信号。

#include <unistd.h>

int pause(void)

只有执行了一个信号处理函数后,挂起才结束。

7、信号的处理

△:当系统捕捉到某个信号时,可以忽略该信号或是使用指定的处理函数来处理该信号,或者使用默认方式。

△:信号处理的主要方法有两种:

一种是:使用简单的signal函数;

另一种是:使用信号集函数组。

8、signal

#include <signal.h>

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

也可以这样理解:

(其实说白了就是一个函数指针,创建一个函数就哦了,下面有例程)~~

typedef void (*sighandler_t)(int)

signhandler_t signal(int signum,sighandler_t handler))

 

func可能的值是:

1、SIG_INT:忽略此信号

2、SIG_DFL:按系统默认方式处理

3、信号处理函数名:使用该函数处理

例程:

 Tiny6410学习ing鈥敚ǘ)、嵌入式Linux应用开发鈥敚3)、进程通讯鈥②

Tiny6410学习ing鈥敚ǘ)、嵌入式Linux应用开发鈥敚3)、进程通讯鈥② 

 

9、共享内存

共享内存是被多个进程共享的一部分物理。

共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。

步骤:

一、创建共享内存,使用shmget函数

二、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。

 

1)创建

key标识共享内存的键值:0/IPC_PRIVATE。

当key的取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存;

如果key是0,而参数shmflg中又设置IPC_PRIVATE这个标识,则同样会创建一块新的共享内存。

返回值:

如果成功,返回共享内存标识符;如果失败,返回-1。

2)映射

int fhmat(int shmind,char *shmaddr,int flag)

参数:

△:shmid:shmget函数返回的共享存储标识符

△:flag:决定以什么方式来确定映射的地址(通常为0)

 

返回值:

如果成功,则返回共享内存映射到进程中的地址;如果失败,返回-1。

3)共享内存

当一个进程不在需要共享内存时,需要把它从进程地址空间中脱离。

int shmdt(char *shmaddr)

例程:

 

Tiny6410学习ing鈥敚ǘ)、嵌入式Linux应用开发鈥敚3)、进程通讯鈥②

Tiny6410学习ing鈥敚ǘ)、嵌入式Linux应用开发鈥敚3)、进程通讯鈥②

Tiny6410学习ing鈥敚ǘ)、嵌入式Linux应用开发鈥敚3)、进程通讯鈥②

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值