linux学习笔记4
进程结束的5个原因
- main函数中return;
- 调用exit函数;
- 调用_exit函数;
- 调用abort函数;
- 调用信号终止;
无论进程怎么终止,最终都会执行相同的内核代码,关闭打开的文件,释放内存资源和其他资源.
exit函数
在main函数,用return和exit是一样,在其他函数中退出进程中的话,就需要用exit函数.//exit所需头文件
#include <unistd.h>
void _exit(int status);
exit调用
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int func()
{
exit(100);
}
int main(int argc,char *argv[])
{
pid_t pid = fork();
int status;
if(pid == -1)
{
printf("fork failed!\n");
return -1;
}
if(pid == 0)
{
func();
}
else
{
printf("parent process!\n");
wait(&status); //获取到的是func函数用exit的100状态
printf("status=%d\n",WEXITSTATUS(status));
return 0;
}
return 0;
}
abort函数,异常退出,没有退出状态
要在.bashrc文件中进行设置. ulimit -c unlimited ,如果没有改配置的话,调用abort不会产生core.xxxx文件,没法用gdb进行调试\ gdb -q abort core.xxxx //abort调试文件 core.xxxx是产生文件
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void func()
{
abort();
}
int main(int argc,char *argv[])
{
pid_t pid = fork();
int status;
if(pid == -1)
{
printf("fork failed!\n");
return -1;
}
if(pid == 0)
{
func();
}
else
{
printf("parent process!\n");
wait(&status);
printf("status=%d\n",WEXITSTATUS(status));
return 0;
}
return 0;
}
kill 函数
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
if( argc > 1)
{
int pid = atoi(argv[1]);
kill(pid,SIGKILL); //通过信号结束进程
}
else
{
printf("pid=%u\n",getpid());
sleep(20);
}
return 0;
}
秋风
2016-11-23