- Exec(函数族):启动一个新的程序
将当前的镜像替换为新的镜像;
相关的exec函数
- 在进程创建成功后,会有两种情况:
(1)多任务,父子进程做的事相同,名称相同;
(2)父子进程做的事不同,名称也不同,如:shell系统——bash,在这里调用了exec函数族,作用是启动(运行)了一个新的程序,本质是在函数调用后用新的镜像程序替代当下的程序。
3.exec函数的种类
int execl(const char *path, const char *arg, ...) —— execl(“路径”,“程序名”,“参数”,NULL);
int execv(const char *path,char *const argv[ ]) —— execv(“路径”,arg);
在这里将“程序名”,“参数”,NULL放进arg[ ]内,然后放到函数中;
execlp和execvp,“p”表示环境变量path,不需要在函数传参时写路径;
execle和execvpe,“e”表示环境变量environ,可以调用extern char **environ作环境变量,在传参的最后要加环境变量environ;
4.exit 库函数
退出状态,终止的进程会通知父进程,自己使如何终止的。
如果是正常结束(终止),则由exit传入的参数。
如果是异常终止,则有内核通知异常终止原因的状态。
任何情况下,父进程都能使用wait,waitpid获得这个状态,以及资源的回收。
void exit(int status)
exit(1);
功能:让进程退出,并刷新缓存区
参数:status:进程退出的状态
return 当该关键字出现在main函数中时候可以结束进程,如果在其他函数中则表示结束该函数。
exit -> 刷新缓存区 -> atexit注册的退出函数 -> _exit
5._exit 系统调用
void _exit(int status);
功能:让进程退出,不刷新缓存区
参数:status:进程退出状态
6.atexit
int atexit(void (*function)(void));
功能:注册进程退出前执行的函数
参数:function:函数指针指向void返回值void参数的函数指针
返回值:成功返回0失败返回非0
当程序调用exit或者由main函数执行return时,所有用atexit
注册的退出函数,将会由注册时顺序倒序被调用
注意:
a. 是exit函数调用时,会调atexit函数
_exit函数调用时,不会调到atexit
b. atexit 程序正常结束
(1).main 返回 //exit
(2).exit()
c.atexit函数 可以多次注册
d.最后"退出清理函数"的调用顺序,与注册顺序相反。
7.进程空间的回收
exit(20);----void exit(int status);
wait/waitpid
exit(EXIT_SUCCESS);// EXIT_SUCCESS ---退出状态值
pid_t wait(int *status);//wait 来获取到
功能:该函数可以阻塞等待任意子进程退出
并回收该进程的状态。
一般用于父进程回收子进程状态。
参数:status 进程退出时候的状态
如果不关心其退出状态一般用NULL表示
如果要回收进程退出状态,则用WEXITSTATUS回收。
返回值:成功 回收的子进程pid
失败 -1;
(1)wait
原型:pid_t wait(int *status);
参数:status 是一个指向整数的指针,用于存储子进程的退出状态。
返回值:成功时返回终止的子进程的 PID;失败时返回 -1,并设置 errno。
fork之后父进程与子进程文件打开的方式与共享