一、自己实现kill命令
1、系统调用kill:man 2 kill
2、回顾kill命令:
Ctrl+c:终止进程
kill PID:终止进程
Ctrl+z :停止进程
kill -9 PID:强制终止进程
3、实现kill命令
mykill.c文件:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <assert.h>
4 #include <unistd.h>
5 #include <signal.h>
6
7 // ./mykill PID 信号代号
8 int main(int argc,char* argv[])
9 {
10 if(argc!=3)
11 {
12 printf("argc error");
13 return -1;
14 }
15 int pid=0;
16 int sig=0;
17 sscanf(argv[1],"%d",&pid);//把argv[1]给pid
18 sscanf(argv[2],"%d",&sig);
19
20 if(kill(pid,sig)==-1)
21 {
22 perror("kill error\n");
23 }
24 exit(0);
25 }
26
27
自定义的mykill信号,使用:./mykill PID 信号代号

4、15号信号和9号信号
15:kill默认发送的信号
9:强制结束的信号,不允许改变;
5、SIGCHLD信号
子进程结束,父进程会收到内核发送的SIGCHLD信号(17);
(1)验证信号
改变SIGCHLD信号的响应方式
(2)处理僵死进程(wait结合信号)
test01.c文件:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<signal.h>
5 #include<sys/wait.h>
6
7 void fun(int sig)
8 {
9 printf("sig=%d\n",sig);
10 int val=0;
11 int id=wait(&val);
12 }
13
14 int main()
15 {
16 int n=0;
17 char *s=NULL;
18 pid_t pid=fork();
19 if(pid==-1)
20 {
21 printf("fork error\n");
22 exit(1);
23 }
24 if(pid==0)
25 {
26 n=3;
27 s="child";
28 }
29 else
30 {
31 signal(SIGCHLD,fun);
32 n=7;
33 s="parent";
34 }
35 for(int i=0;i<n;i++)
36 {
37 printf("s=%s\n",s);
38 sleep(0);
39 }
40 exit(0);
41 }
~
运行结果:

作业:写mybash
2325

被折叠的 条评论
为什么被折叠?



