热门关键字:  ubuntu  分区  函数  Fedora  linux系统进程

当前位置 :| 主页>Linux教程>内核研究>

进程间软中断通信(signal函数和kill函数)

来源: 作者: 时间:2008-06-04 Tag: 点击:
我使用系统函数signal()捕获信息,父进程使用kill()函数向子进程发送软中断信号。呵呵~~一个小实验,贴出来帮助和我一样的出现学者,从而了解信号通信方式

介绍:

信号实现是操作系统用来通知应用进程有事件发生的一种机制,信号可以由一个进程产生,从而使另一个进程中断,并通过执行针对该特定信号预定义的代码,有选择的捕获这个信号。

在Linux中signal函数是比较复杂的一个,其定义原型如下:
void (*signal(int signo,void (*func)(int))) (int)
这个函数中,最外层的函数体
void (* XXX )(int)表明是一个指针,指向一个函数XXX的指针,XXX所代表的函数需要一个int型的参数,返回void
signal(int signo, void(*func)(int))是signal函数的主体.
需要两个参数int型的signo以及一个指向函数的函数.
void (*func)(int).
正是由于其复杂性,在[Plauger 1992]用typedef来对其进行简化
typedef void Sigfuc(int);//这里可以看成一个返回值 .
再对signal函数进行简化就是这样的了
Sigfunc *signal(int,Sigfuc *);
我们在使用时signal,第一个参数代表信号,第二个参数代表接收到这个参数时所进行的操作。
'E&\TlP w0
4H?NZ m`0kill函数的定义和原型如下:
int kill(pid_t pid, int sig);IXPUB技术博客?I9QaP\i.q
使用时要引入如下的两个头文件:
#include <sys/types.h>
*N5b2BP)?e0#include <signal.h>
参数说明:
'y/?\[%r ? @0O0pid:可能选择有以下四种:
1. pid大于零时,pid是信号欲送往的进程的标识。IXPUB技术博客^V v hZ+k&lS#I&U
2. pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。IXPUB技术博客,S }3_T7]B4{g$y
3. pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。IXPUB技术博客#hlzB I
4. pid小于-1时,信号将送往以-pid为组标识的进程。
sig:准备发送的信号代码,假如其值为零则没有任何信号送出,但是系统会执行错误检查,通常会利用sig值为零来检验某个进程是否仍在执行。IXPUB技术博客pj,Ma+\4S

M%U6o EK ~?s{*RP`0返回说明:IXPUB技术博客9y+NnS:d(rn-Wn#|)w
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
FZj um YA9m~@0EINVAL:指定的信号码无效IXPUB技术博客zSnS8gru3^
EPERM;没有给任何目标进程发送信号的权限
OAVB6ZL~G0ESRCH:目标进程或进程组不存在

以下就是一个小实例:

#include <stdio.h>IXPUB技术博客$|(AQBte v
#include <string.h>IXPUB技术博客;h%E8CGe{4GI
#include <signal.h>
.FhP_-Eq&x#G)@0#include <asm/unistd.h>IXPUB技术博客5Gu@1\j
#include <sys/types.h>IXPUB技术博客Y7A#M0l`'A8_"V
int waite;
#T|%i"vf1t4p#\0void start(){IXPUB技术博客Xd X'mvX
waite=0;IXPUB技术博客T[4C%?*~y jJm
}
%q,Bt/i'^:O]"KSc*p%C&}0static void waiting(){
,R2\cP,kD1cF0 while(waite==1);
!O|7a8n}gU0}

main(){
d1Y\zD rAZ0 int stat1=0,stat2=0;IXPUB技术博客;~ f Qs8db f/B
int pid1,pid2;
[,t4d6Mr!U6d0 while((pid1=fork())==-1);IXPUB技术博客vUgl-z+b
if(pid1>0){
7K[ tYG!E*z'mc3\O0 printf("chilld process 1 is %d\n",pid1);IXPUB技术博客9I@5u9qq(WH3O
while((pid2=fork())==-1);
6V~J6b({iWcD;Bx[0 if(pid2>0){
*AKN,_!Q%BI*f0 printf("child process 2 is %d\n",pid2);
]P4A&{\k%CDy%NXy0 printf("please press 'delete'\n");
!_Pe*yCq[/Z^0 waite=1;IXPUB技术博客"]1j ?}l;v9u8WV
if(signal(SIGUSR1,start));
U9g;K)P`0 else{
|?u5a2f9f^3e%^0 alarm(5);
U/]'Yt?m2a[0 signal(SIGALRM,start);IXPUB技术博客o+Rt h?.f l2U
}
%jZ5WgUbHQ.w0 waiting();IXPUB技术博客p'c,bIYpQ]
kill(pid1,16);IXPUB技术博客#y9H a/aW}
kill(pid2,17);IXPUB技术博客*|'O9I2s i3qbAIV ^@
wait(0);
T k.s9D/iZr0 wait(0);IXPUB技术博客4N~*P4_ gMJ/J?a
printf("parent process is killed\n");IXPUB技术博客,DgK3U+l
exit(0);
*o{'Y$a _ j3I0 }
A_6t v z0 else{
H/^6lG2\EWSi0 waite=1;
)j,? ^7u,Y;U;wt0 signal(17,start);
k4M D5?8b;@ay,G/@Z0 waiting();
eiX'n4^1g0 printf("child 2 is killed\n");
;|?i(V}{0 exit(0);
!iI$y/eF ph0 }IXPUB技术博客;A E6Ht]9E/c S#O+d
}IXPUB技术博客s&w"E#u;AND
else{
3O+?#W?@'FdP'p0 waite=1;
#{4G$Zb3v wM b0 signal(16,start);IXPUB技术博客CUj,[7tZ?k
waiting();IXPUB技术博客s$z6KF0M%T:c/RV @
printf("child 1 is killed\n");IXPUB技术博客CF&XI4U4Zt:U)M'I
exit(0);
$^3eh[0Zl%lYo&O0 }IXPUB技术博客c,j#eNI
}


最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册