进程的退出 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;
}