Unix环境高级编程读书笔记(7)

1、int execl(const char*pathname,const char*arg,...);
int execv(const char*pathname,char*constarg[]);
int execlp(const char*filename,const char*arg,...);
int execvp(const char*filename,char*const argv[]);
int execle(const char*pathname,const char*arg,...,char*const evn[]);
int execve(const char*pathname,char*const arg[],char*const env[]);


系统调用exec是以新的程序代替原来的程序,替换了原来的代码段、数据段、堆、栈的内容,新程序从main函数开始执行,因为没有创建新的进程,所以,替换前后进程ID保持不变


在exec前后,实际用户ID和实际组ID保持不变,而有效ID是否改变则取决于所执行程序文件的设置用户ID位和设置组ID为是否设置,如果新程序的设置用户ID位已设置,则有效用户ID变成程序文件所有者ID;否则有效用户ID不变,对组ID的处理方式与此相同。


2、会话(session)是一个或多个进程组的集合
每个进程组有一个组长进程,组长进程的进程组ID等于其进程ID;如果要创建一个新会话,则需用函数setsid(),且调用此函数的进程不是一个进程组ID,具体会发生以下
3种事情:
1)该进程变成新会话的首进程,此时,该进程是新会话中的唯一进程
2)该进程成为一个新进程该组的组长进程,新进程组ID是调用该进程的进程ID
3)该进程没有控制终端,如果在调用setsid之前该进程有一个控制终端,那么这种联系也被切断


如果创建会话的进程是一个进程组的组长,则创建失败,通常情况下,先调用fork,然后使其父进程终止,而子进程继续,子进程继承了父进程的进程组ID,而其进程ID是新分配的,这样保证了子进程不是一个进程组的组长


1)一个会话可以有一个控制终端
2)建立与控制终端连接的会话首进程被称为控制进程
3)一个会话中的几个进程组可被分成一个前台进程组以及一个或多个后台进程组
4)如果一个会话有一个控制终端,则它有一个前台进程组,其它进程组为后台进程组
5)无论何时键入终端的中断键,都会将终端信号发送至前台进程组的所有进程
6)无论何时键入终端的退出键,都会将退出信号发送至前台进程组的所有进程
7)如果终端接口检测到调制解调器已经断开连接,则将挂断信号发送至控制进程

猜你喜欢

转载自blog.csdn.net/metheir/article/details/70211207
今日推荐