Chinaunix首页 | 论坛 | 博客
  • 博客访问: 614195
  • 博文数量: 79
  • 博客积分: 848
  • 博客等级: 军士长
  • 技术积分: 1800
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-26 19:30
文章分类

全部博文(79)

文章存档

2015年(4)

2013年(39)

2012年(36)

分类: C/C++

2012-09-04 17:44:35

今天在做任务调度的时候,需要实现任务的取消操作!这就用到了我们今天总结的kill函数,大家平时一定经常的用到kill命令来杀死一些阻塞或者僵死的进程,相信对于它一定不会陌生!kill函数实际上是一种信号机制,他将信号发送给其他的进程和进程组。与之相似的还有一个raise函数,但是raise函数实现的是进程向自身发信号!
函数原型:
#include
int kill(pid_t,int signo);
int raise(int signo);
调用了raise函数,实际上相当于调用kill(getpid(),signo);来实现进程的自杀!!
kill 的pid参数有四种不同的情况:
pid > 0将信号发给pid
pid < 0将该信号发送给其进程组id等于pid的绝对值的进程组,但是不包含某些系统进程!
pid == 0将信号发送给与该进程属于同一个进程组的所有进程,但是并不包含实现定义的系统进程集,例如“init0"
pid = -1将信号发给该进程有权限向其发送信号的所有进程,但是同样不包含某些系统进程集!
至于signo经常用到了有两个信号:SIGINT和SIGKILL
SIGINT信号是可以被进程截获甚至忽略的,
SIGKILL信号是不能被进程截获的。
就是说,用SIGINT信号kill进程,进程可以有自己的信号处理程序,并可以进行适当的善后处理,然后退出;但另一方面,接收到SIGINT信号的进程 也完全可以忽略该信号,而不终止自己。
而用SIGKILL信号kill进程,该进程则直接被杀死。
如果确实要“干净利索”的干掉一个进程,可以考虑SIGKILL,但是有丢失该进程正在处理的数据的危险。
下面举个例子来说明一下:
 #include
#include
#include
#include
void main()
{
        pid_t pid;
        int status;
        if((pid = fork()) < 0)//创建一个子进程
        {
                printf("fork() error!\n");
                exit(-1);
        }
        else if(pid == 0)//让子进程处于休眠状态
        {
                printf("this is the child process!!\n");
                sleep(1000000);
        }
        else
        {
                sleep(1);
                int i = waitpid(pid, &status, WNOHANG);//跳用waitpid函数来返回子进程的状态
                printf("%d\n",i);
                printf("the state is %d\n",status);
                kill(pid,SIGKILL);//跳用kill函数传递SIGKILL命令
             //kill(pid,SIGINT);//跳用kill函数传递SIGINT命令
                sleep(3);//等待kill执行完毕
                int j = waitpid(pid, &status, WNOHANG);//查看进程结束的返回状态!
                printf("%d\n",j);
                printf("the state is %d\n",status);
        }
}
分别执行不同信号的kill函数,通过打印出来的状态可以看出不同信号执行的命令,进程产生的动作是不同的!值得我们注意!!


阅读(22823) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

qcxlf2018-05-25 10:05:40

您好,最近遇到类似同样的问题,如果用“kill(pid,SIGINT)”,咋样安全退出子进程,对子进程的数据咋处理么?THANKS

风箫夜吟2012-10-10 14:43:14

CU官方博客: 【本篇参与博客评选】一般SIGTERM信号是用来杀死某进程的。SIGKILL则是在该进程不响应任何信号的时候的无奈之举。
因为SIGKILL是不能被进程捕获,阻塞或者忽略。.....
多谢专家的点评,SIGKILL信号我是了解一些的,这里考虑这个信号的使用,主要是在某些情况下进行进程调度的时候,如果一个进程无法使用SIGINT信号来kill的时候,而调度系统需要强制来结束的时候才使用SIGKILL的信号的!不知道理解的对不对!多谢 多谢!

CU官方博客2012-10-10 10:29:12

【本篇参与博客评选】一般SIGTERM信号是用来杀死某进程的。SIGKILL则是在该进程不响应任何信号的时候的无奈之举。
因为SIGKILL是不能被进程捕获,阻塞或者忽略。由内核直接处理,结束该进程,导致该进程失去了进行清理工作。所以尽量不要使用SIGKILL来结束进程。
详细的signal介绍,可以阅读man 7 signal。--GFree_Wind专家点评