linux学习笔记4

进程结束的5个原因

  1. main函数中return;
  2. 调用exit函数;
  3. 调用_exit函数;
  4. 调用abort函数;
  5. 调用信号终止;
 前3种是正常退出的.后2种是异常退出.
 无论进程怎么终止,最终都会执行相同的内核代码,关闭打开的文件,释放内存资源和其他资源.

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