首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

父进程如何干净明白的杀死子进程!kill函数小结

父进程如何干净明白的杀死子进程!kill函数小结

在做任务调度的时候,需要实现任务的取消操作!这就用到了我们今天总结的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函数,通过打印出来的状态可以看出不同信号执行的命令,进程产生的动作是不同的!值得我们注意!!
继承事业,薪火相传
返回列表