Linux C系统编程-进程exit,exec和内存资源(三)

进程的退出 exit()/_exit()

1.进程退出函数作用是什么?
当进程执行了exit()/_exit(),整个进程就会马上退出。

int main(int argc,char *argv[]) 
{
	if(argc!=2)  //如果传递的参数不等于2个
	{
		exit(-1);   //那么就直接退出进程
	}
	
	exit(0);	
}

2.函数如何使用?
exit() man 3 exit
在这里插入图片描述

_exit() -> man 2 _exit
在这里插入图片描述

   status:进程的退出状态    返回父进程(前提父进程必须主动回收资源)
	    0   代表进程正常退出
	   非0  代表进程异常退出
int main()
{
	pid_t x;
	int state;
	
	x = fork();
	if(x > 0)
	{
		wait(&state);
		printf("state = %d\n",state);  // 父进程可以知道子进程的退出状态
		exit(0);
	}
	
	if(x == 0)
	{
		printf("helloworld!\n");
		exit(0);
	}
	
	return 0;
}

3.exit()/_exit()有什么区别?
这两个函数功能类似,都是用于退出进程,但是两者缓冲区处理机制不一样。

exit() 进程退出时,输出缓冲区数据,再退出!
_exit() 进程退出时,不会输出缓冲区数据,直接退出!

exit()函数与return语句

void fun()
{
	//return;  // return代表函数的结束,返回到函数调用的地方
	exit(0);   // 执行exit(0)代表整个进程退出,不会执行任何的代码。
}

int main(int argc,char *argv[])
{
	fun();
	printf("helloworld!\n");
}

结论:由于在main函数内调用return相当于程序的退出,所以在main函数内执行exit()与return是一样的。

exec函数族

什么是exec函数?
作用就是装入/运行到其它的程序到子进程。 project程序装入子进程

在这里插入图片描述
path:程序的绝对路径
file:文件名 -> 要求文件路径必须在环境变量下
arg:希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志
envp:环境变量路径,填NULL不设置环境变量

产生一个子进程,用于执行“ls -l”进程。

int main()
{
	pid_t x;
	x = fork();

	if(x > 0)
	{
		wait(NULL);
	}
	
	if(x == 0)
	{
		printf("apple!\n");
		execl("/bin/ls","ls","-l",NULL); //argv[0] argv[1] argv[2] ./project aaa bbb
		execlp("ls","ls","-l",NULL);
		printf("helloworld!\n");
	}
	
	return 0;
}

父子进程内存资源

父进程fork出一个子进程之后,会将自己资源拷贝一份资源(除了PID号)到子进程中。

int main()
{	
	int a = 100;
	pid_t x = fork();
	if(x > 0)
	{
		int B = 30;
		a = 50;  // 只是修改了父进程中内存空间的a,并没有修改子进程中a
		printf("parent a = %d\n",a);
		printf("%d\n",B);
	}
	
	if(x == 0)
	{
		printf("child a = %d\n",a);
		printf("%d\n",B);  // B变量没有定义,编译出错
	}
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值