僵死进程: 父进程没有等待子进程,wait() 子进程会变成僵死进程。
int main(int arg, char *args[])
{
pid_t pid = fork();//调用fork产生一个子进行
int status;
if (pid == -1)
{
printf("fork failed\n");
return 0;
}
if (pid == 0)//子进程调用execve,执行ls -l命令
{
exit(0);//子进程退出了,变成了僵死进程。
}
else
{
printf("father exit");
//wait(&status);//阻塞调用,直到子进程退出,wait才返回
sleep(10);//没有等待子进程状态。
return 0;//父进程退出
}
}
孤儿进程: 父进程退出子进程还没有退出,会由init进程接管变成孤儿进程。
int main(int arg, char *args[])
{
close(STDOUT_FILENO);//关闭标准输出
open("/dev/pts/2", O_WRONLY);//打开"/dev/pts/2",做为标准输出
pid_t pid = fork();//调用fork产生一个子进行
int status;
if (pid == -1)
{
printf("fork failed\n");
return 0;
}
if (pid == 0)//子进程调用execve,执行ls -l命令
{
char *args[] = { "/bin/ls", "-l", NULL };
execve("/bin/ls", args, NULL);
}
else
{
return 0;//父进程退出
}
}
//父进程等待子进程退出的代码
int main(int arg, char *args[])
{
pid_t pid = fork();//调用fork之后会有两个进程
int status;
if (pid == 0)
{
printf("child begin\n");
sleep(5);
printf("child end\n");
return -1;
}
if (pid > 0)
{
printf("parent begin\n");
wait(&status);//阻塞调用,直到子进程退出,wait才返回
printf("child return = %d\n", WEXITSTATUS(status));
printf("parent end\n");
}
return 0;
}
//僵死进程
//父进程没有调用wait,子进程就退出了,这个时候子进程就成了僵死进程
进程退出的5种方式:
return 跟exit 在主函数main中效果是一样的,只是在子函数中,才有区别,子函数中return只是退出子函数,exit才是退出进程。
exit 在main函数中跟return是一样的,只是在子函数中不相同。
_exit
abort 异常退出。生成一个core.xxx文件 (ulimit -c unlimited)
信号 kill(pid , SIGKILL);