一、信号——exec
1. 信号的基本概念
信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作。 与信号有关的系统调用在“signal.h”头文件中有声明常见信号的值,及对应的功能说明:
2. 相应方式
kill() 发送命令(当系统执行kill()时,系统接受信号,杀死进程) singal() 修改对信号的响应
3. 信号的值在系统源码中的定义如下
1. #define SIGHUP 1
2. #define SIGINT 2
3. #define SIGQUIT 3
4. #define SIGILL 4
5. #define SIGTRAP 5
6. #define SIGABRT 6
7. #define SIGIOT 6
8. #define SIGBUS 7
9. #define SIGFPE 8
64 到图论,学 IT,找好工作
图论科技
65 到图论,学 IT,找好工作
10. #define SIGKILL 9
11. #define SIGUSR1 10
12. #define SIGSEGV 11
13. #define SIGUSR2 12
14. #define SIGPIPE 13
号会终止程序
15. #define SIGALRM 14
16. #define SIGTERM 15
17. #define SIGSTKFLT 16
18. #define SIGCHLD 17
号
19. #define SIGCONT 18
20. #define SIGSTOP 19
21. #define SIGTSTP 20
22. #define SIGTTIN 21
23. #define SIGTTOU 22
24. #define SIGURG 23
4. exec信号过程
5. 修改信号的响应方式
typedef void (*signhandler_t)(int);
signhander_t signal(int signum,sighandler_t handler);
6. 忽略信号
7. kill -9
kill -9信号,不允许忽略信号,强制杀死进程,可以使管理员在任意情况下终止进程。
8. 发送信号
用sscanf转化数据类型
用atoi转化数据类型
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<signal.h>
5
6 int main(int argc,char* argv[])
7 {
8 if(argc!=3)
9 {
10 printf("main arg err\n");
11 exit(1);
12 }
13
14 int pid=0;
15 int sig=0;
16 sscanf(argv[1],"%d",&pid);
17 sig=atoi(argv[2]);
18 if(kill(pid,sig)==-1)
19 {
20 printf("kill err\n");
21 }
22 exit(0);
23 }
9. 特殊信号
#define SIGCHLD 17
10. 处理僵死进程
程序代码
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<signal.h>
5 #include<sys/types.h>
6 #include<sys/wait.h>
7
8 void fun(int sig)
9 {
10 printf("sig=%d\n",sig);
11 int val=0;
12 int id=wait(&val);
13 printf("id=%d,exit code:%d\n",id,WEXITSTATUS(val));
14 }
15 int main()
16 {
17 signal(SIGCHLD,fun);
18 int n=0;
19 char* s=NULL;
20
21 pid_t pid=fork();
22 if(pid==-1)
23 {
24 exit(1);
25 }
26 if(pid==0)
27 {
28 n=3;
29 s="child";
30 }
31 else
32 {
33 n=7;
34 s="parent";
35 }
36
37 for(int i=0;i<n;++i)
38 {
39 printf("s=%s\n",s);
40 sleep(1);
41 }
42
43 exit(0);
44 }
运行结果
11. 如何判断是否收到信号
|