手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

[转载]Linux的信号机制

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

_exit()、access()、alarm()、cfgetispeed()、cfgetospeed()、cfsetispeed()、 cfsetospeed()、chdir()、chmod()、chown()、close()、creat()、dup()、dup2()、 execle()、execve()、fcntl()、fork()、fpathconf()、fstat()、fsync()、getegid()、 geteuid()、getgid()、getgroups()、getpgrp()、getpid()、getppid()、getuid()、 kill()、link()、lseek()、mkdir()、mkfifo()、 open()、pathconf()、pause()、pipe()、raise()、read()、rename()、rmdir()、setgid ()、setpgid()、setsid()、setuid()、 sigaction()、sigaddset()、sigdelset()、sigemptyset()、sigfillset()、 sigismember()、signal()、sigpending()、sigprocmask()、sigsuspend()、sleep()、 stat()、sysconf()、tcdrain()、tcflow()、tcflush()、tcgetattr()、tcgetpgrp()、 tcsendbreak()、tcsetattr()、tcsetpgrp()、time()、times()、 umask()、uname()、unlink()、utime()、wait()、waitpid()、write()。
即使信号处理函数使用的都是"安全函数",同样要注意进入处理函数时,首先要保存errno的值,结束时,再恢复原值。因为,信号处理过程中,errno 值随时可能被改变。另外,longjmp()连同siglongjmp()没有被列为可再入函数,因为不能确保紧接着两个函数的其他调用是安全的。
三、深入浅出:信号应用实例
linux下的信号应用并没有想象的那么恐怖,程式员所要做的最多只有三件事情:
1. 安装信号(推荐使用sigaction());
2. 实现三参数信号处理函数,handler(int signal,struct siginfo *info, void *);
3. 发送信号,推荐使用sigqueue()。
实际上,对有些信号来说,只要安装信号就足够了(信号处理方式采用缺省或忽略)。其他可能要做的无非是和信号集相关的几种操作。
实例一:信号发送及处理
实现一个信号接收程式sigreceive(其中信号安装由sigaction())。
#include
#include
#include
void new_op(int,siginfo_t*,void*);
int main(int argc,char**argv)
{
struct sigaction act;
int sig;
sig=atoi(argv[1]);

sigemptyset(&act.sa_mask);
act.sa_flags=SA_SIGINFO;
act.sa_sigaction=new_op;

if(sigaction(sig,&act,NULL) < 0)
{
printf("install sigal error\n");
}

while(1)
{
sleep(2);
printf("wait for the signal\n");
}
}
void new_op(int signum,siginfo_t *info,void *myact)
{
printf("receive signal %d", signum);
sleep(5);
}
说明,命令行参数为信号值,后台运行sigreceive signo &,可获得该进程的ID,假设为pid,然后再另一终端上运行kill -s signo pid验证信号的发送接收及处理。同时,可验证信号的排队问题。
注:能够用sigqueue实现一个命令行信号发送程式sigqueuesend,见附录1。
实例二:信号传递附加信息
主要包括两个实例:
1. 向进程本身发送信号,并传递指针参数;
2. #include
3. #include
4. #include
5. void new_op(int,siginfo_t*,void*);
6. int main(int argc,char**argv)
7. {
8. struct sigaction act;
9. union sigval mysigval;
10. int i;
11. int sig;
12. pid_t pid;
13. char data[10];
14. memset(data,0,sizeof(data));
15. for(i=0;i < 5;i )
16. data[i]='2';
17. mysigval.sival_ptr=data;
18.
19. sig=atoi(argv[1]);
20. pid=getpid();
21.
22. sigemptyset(&act.sa_mask);
23. act.sa_sigaction=new_op;//三参数信号处理函数
24. act.sa_flags=SA_SIGINFO;//信息传递开关
25. if(sigaction(sig,&act,NULL) < 0)
26. {
27. printf("install sigal error\n");
28. }
29. while(1)
30. {
31. sleep(2);
32. printf("wait for the signal\n");
33. sigqueue(pid,sig,mysigval);//向本进程发送信号,并传递附加信息
34. }
35.
36. }
37.
38. void new_op(int signum,siginfo_t *info,void *myact)//三参数信号处理函数的实现
39. {
40. int i;
41. for(i=0;i<10;i )
42. {
43. printf("%c\n ",(*( (char*)((*info).si_ptr) i)));
44. }
45. printf("handle signal %d over;",signum);
46. }
47.
这个例子中,信号实现了附加信息的传递,信号究竟如何对这些信息进行处理则取决于具体的应用。
48. 2、 不同进程间传递整型参数:把1中的信号发送和接收放在两个程式中,并且在发送过程中传递整型参数。
信号接收程式:
49. #include
50. #include
51. #include
52. void new_op(int,siginfo_t*,void*);
53. int main(int argc,char**argv)

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!