kill命令的简单实现
目标:简单实现kill命令
功能:
- 向进程发送信号
- 列出信号名字
参数:
- -l 列出信号名字
- -s (s=1、2、3.....)发送的信号代号
环境
ubuntu 14.04 gcc.real (Ubuntu 4.8.2-19ubuntu1) 4.8.2
代码
新手菜鸟 如有错误 欢迎指正
#include<stdio.h>
#include<signal.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
int sent_sig(int signum,char *pid);
void list_signum(char *optarg);
unsigned int chartonum(char *str);
int main(int argc,char **argv)
{
int opt;
int signum=0;
char optstring[]=":1,2,3,4,5,6,7,8,9,l:";
while((opt=getopt(argc,argv,optstring))!=-1)
switch(opt){
case '1': case '2': case '3':
case '4': case '5': case '6':
case '7': case '8': case '9':
signum=opt-'0';
break;
case 'l':
list_signum(optarg);
break;
case ':':
printf("-l need argument!
");
exit(1);
case '?':
printf("unknow option!
");
exit(1);
}
if(argc==1){
printf("no option!,no pid
");
exit(1);
}
if(optind==argc){
if(kill(-1,signum)!=0){
printf("wrong in sent sig to all process!
");
exit(1);
}
else
return 0;
}
for(;optind<argc;optind++){
if(!sent_sig(signum,argv[optind])){
printf("no such process
");
exit(1);
}
}
return 0;
}
unsigned int chartonum(char *str)
{
char *s=str;
unsigned int pid=0;
while(*s){
pid=pid*10+(*s-'0');
s++;
}
return pid;
}
int sent_sig(int signum,char *str)
{
unsigned int pid=chartonum(str);
if(signum==0)
signum=9;
if(kill(pid,signum)!=0)
return 0;
else
return 1;
}
void list_signum(char *optarg)
{
char *str;
int signum=chartonum(optarg);
str=strsignal(signum);
printf("%s
",str);
}