并发程序设计--D2D3exec函数族和守护进程

exec 函数族

背景:fork创建进程之后,子进程和父进程执行相同的代码,但是在实际开发当中,我们希望父子进程执行不同的代码

作用:执行指定的程序

#include 

  int execl(const char *path, const char *arg, …);

  int execlp(const char *file, const char *arg, …);

 成功时执行指定的程序;失败时返回EOF

 path   执行的程序名称,包含路径

 arg…  传递给执行的程序的参数列表

 file   执行的程序的名称,在PATH中查找

并发程序设计--D2D3exec函数族和守护进程_第1张图片

注意:两个函数区别execlp不需要写文件名全路径,在PATH查找

    最后一个参数必须用空指针(NULL)作结束

进程当前内容被指定的程序替换,但进程号不变

0个参数必须要写,虽然它没有使用

并发程序设计--D2D3exec函数族和守护进程_第2张图片

并发程序设计--D2D3exec函数族和守护进程_第3张图片并发程序设计--D2D3exec函数族和守护进程_第4张图片

守护进程(Daemon Process)

并发程序设计--D2D3exec函数族和守护进程_第5张图片

概念:

守护进程又叫精灵进程(Daemon Process),它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

特点:

始终在后台运行,独立于任何终端,周期性的执行某种任务或等待处理特定事件。

它是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示。由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。

举例:

http 服务的守护进程叫 httpd,mysql 服务的守护进程叫 mysqld。

更简便地创建守护进程: nohup 命令

nohup  xxxx  &

创建守护进程方法:

        1、创建子进程,父进程退出

并发程序设计--D2D3exec函数族和守护进程_第6张图片

        2、子进程创建新会话

并发程序设计--D2D3exec函数族和守护进程_第7张图片

         3、更改当前工作目录(非必须)

并发程序设计--D2D3exec函数族和守护进程_第8张图片

         4、重设文件权限掩码(非必须)

并发程序设计--D2D3exec函数族和守护进程_第9张图片

         5、关闭打开的文件描述符

并发程序设计--D2D3exec函数族和守护进程_第10张图片

         此时不能在屏幕上打印东西,不能在键盘上获取东西

setsid函数:

pid_t setsid(void);

成功:返回调用进程的会话ID;失败:-1,设置errno。
调用了setsid函数的进程,既是新的会长,也是新的组长

getsid函数

pid_t getsid(pid_t pid)

成功:返回调用进程的会话ID;失败:-1,设置errno

1.pid为0表示察看当前进程session ID

2.ps ajx命令查看系统中的进程。参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息。

3.组长进程不能成为新会话首进程,新会话首进程必定会成为组长进程。

getpid:pid_t getpid(void);       获取进程id

getpgid:pid_t getpgid(pid_t pid);   获取进程组id

并发程序设计--D2D3exec函数族和守护进程_第11张图片并发程序设计--D2D3exec函数族和守护进程_第12张图片

并发程序设计--D2D3exec函数族和守护进程_第13张图片 

并发程序设计--D2D3exec函数族和守护进程_第14张图片

你可能感兴趣的:(应用层,linux)