Linux第15节课笔记

一、自己实现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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值