在linux下进程编程时调用KILL函数的时候,如果kill的是一个pid大于0的进程,那么实际效果就是kill掉了该pid的进程,但是注意下面一段代码
pid_t pid;
pid = get_pid_by_name("server");
printf("pid:%d\n",pid);
printf(" pid of server :%d \n",pid);
kill(pid,SIGKILL);
有一个要注意的地方,就是get_pid_by_name这个函数(这也是一个手工编写的函数,通过遍历进程表来寻找参数所指定名称的程序所对应的进程的PID),要特别注意其返回值的判断。如果能在进程表里找到这个进程,当然程序可以正常运行下去,而如果没有找到的话则返回-1。由于代码处于调试阶段,所以我之前比较疏忽,没有判断返回值就直接调用kill(pid,SIGKILL),心想如果kill(-1,SIGKILL)无非就是找不到对应的进程id,然后kill失败,但事实证明结果是毁灭性的。。。。。在某嵌入式设备上运行这个程序的结果是,该设备直接断开和PC机的联系,且无法再连上,直到重装该设备的OS才解决。而把这段程序在UBUNTU上运行的结果则是,UBUNTU直接重启。。。
于是我再次查阅了kill函数的用法,果然很悲剧
定义函数 int kill(pid_t pid,int sig);
函数说明
kill()可以用来送参数sig指定的信号给参数pid指定的进程。参数pid有几种情况:
pid>0 将信号传给进程识别码为pid 的进程。
pid=0 将信号传给和目前进程相同进程组的所有进程
pid=-1 将信号广播传送给系统内所有的进程
pid<0 将信号传给进程组识别码为pid绝对值的所有进程
当pid=-1时,将SIGKILL信号广播给了系统内所有进程。。。。后果自然可想而知。
所以,编写代码的时候,对于一些可能发生的错误,提前用代码处理一下是一个好习惯!
over