linux下杀子进程(调用kill)
在linux里面,fork()一个子进程,结果怎么都杀不掉。由于不是root用户,使用kill -9 pid,也没用。
在ps -awt的时候总是能看到那个子进程。我在子进程里面起了个shell。
后来google了一下,发现要调用waitpid才可以。
这个是所谓的zombie(僵尸进程)
引用一段:
在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程。
僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程
附测试代码:
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <signal.h>
int main( void )
{
FILE *stream;
FILE *wstream;
char buf[1024],buf1[1024];
int i,j,pid;
memset( buf, '\0', sizeof(buf) );//初始化buf,以免后面写如乱码到文件中
pid = fork();
if(pid>0)
{
printf("parant start!%d\n",pid);
sleep(2);
//sprintf(buf,"kill -9 %d\n",pid);
if (j = kill(pid,SIGTERM) < 0)//SIGKILL
printf("parent system failed!\n");
else
printf("system:%s\n,result:%d\n",buf,j);
printf("parant end!\n");
pid=wait(NULL);
printf("I catched a child process with pid of %d\n",pid);
&nb
相关文档:
一:前言
最近在研究android的sensor driver,主要是E-compass,其中用到了Linux input子系统.在网上也看了很多这方面的资料,感觉还是这篇分析的比较细致透彻,因此转载一下以便自己学习,同时和大家分享!
(这篇博客主要是以键盘驱动为例的,不过讲解的是Linux Input Subsystem,可以仔细的研究一下!)
键盘驱动将检 ......
Linux移植开发 准备工作: 准备交叉编译工具链:这里我们选择DENX软件工程提供的ELDK交叉编译环境,参考地址:http://ftp.denx.de/pub/eldk/4.2/,我们使用其中的一套工具。准备工作步骤如下: 1. 建立工作文件夹NewMsg2410,并建立子目录sources works tools mkdir NewMsg2410 mkdir sources works tools 2. 准备arm- ......
1、启动emulator(模拟器)
在Dos中输入emulator后回车即可启动emulator,前提是你把android sdk 的tools目录添加到了环境变量里面;否则的话,你必须先进入android sdk的tools目录下,再输入emulator命令。
2、查看android支持的linux 命令
待模拟器启动好之后,在Dos中输 ......
在前面的博文里,我们讲解了基于80x86体系的Linux内核分段和分页机制,并详细地讨论了Linux的内存布局。有了这些基本概念以后,我们就来详细讨论内核如何动态地管理那些可用的内存空间。
对于80386这种32位的处理器结构,Linux采用4KB页框大小作为标准的内存分配单元。内核必须记录每个页框的当前状态,例如,区分哪些页框 ......
干嘛学习 Scripts
这个问题可有趣的很了,我为什么要学习 scripts 呢?不要学可不可以呀!?呵呵!如果您只想要『会用』 Linux 就好的话,那么这一个部分确实可以先跳过去不看也没关系,不过,如果您想要更加的了解与控制 Linux ,使 Linux 运作更顺畅之外,还可以高枕无忧的让你的 Linux Server 在 Internet 上面提供相关 ......