Day 29.30 进程控制编程(2)

 

1.vfork()

#include<unistd.h>

 pid_t vfork(void);

 

vfork函数创建的新进程,刚开始时会暂时与父进程共享地址空间。另外,vfork函数保证子进程先运行,在它调用exit之后父进程才可能被调度运行。

 

区别:1.   fork:子进程拷贝父进程的数据段     

              vfork:子进程与父进程共享数据段

        2.   fork:父、子进程的执行次序不确定 

              vfork:子进程先运行,父进程后运行

//   3vfork.c

 

 

2.exec函数族

  exec 函数族提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。另外,这里的可执行文件既可以是二进制文件,也可以是 Linux 下任何可执行的脚本文件。

 

Linux 中使用 exec 函数族主要有两种情况:

1、当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用任何 exec 函数族

让自己重生;

2、如果一个进程想执行另一个程序,那么它就可以调用 fork 函数新建一个进程,然后

调用任何一个 exec,这样看起来就好像通过执行应用程序而产生了一个新进程 (这种情况非常普遍)。(如由软件跳转到广告网页)

也可以使用system函数。system = fork + execsystem原子操作中途不能断开。

 

3.进程的终止

下面两个函数都用于正常终止一个进程:_exit立即进入内核,exit先执行一些清理处理(调用各终止处理程序、关闭所有标准I/O流等),然后进入内核。

#include <stdlib.h>

void exit(int status);

#include <unistd.h>

void _exit(int status);

(echo $?正常退出为0非正常退出打印退出码)(5exit_status.c)

    这两个函数都有一个整型参数称之为终止状态(exit status)

 

 

4.孤儿进程

   父进程先于子进程先死!那么子进程就变成了孤儿进程(守护进程)Linux系统规定:所有的孤儿进程会自动成为一个特殊进程(进程1,也就是init进程)的子进程!

 

 

//    6lonelychild.c

 

6.僵尸进程

 

进程所需要的资源分为两种:一种是向操作系统申请的,一种是进程本身的!第一类是进程工作时消耗的内存,第二类是进程的task_struct和栈内存,是进程自己带来的。这两种资源需要分开清理第一类资源当程序退出时有操作系统自动回收,第二类资源由其父进程回收。

     但是子进程结束后,父进程不是立刻对其进行回收,而要等一段时间!所以在子进程已经结束但是父进程还没对其进行处理的时间段,子进程就被称为僵尸进程!(子亡父忙

 

//   7zoombie.c

 

7.进程等待

  • 父进程创建子进程后,如何知道子进程什么时候终止?如何知道子进程怎么终止(正常or异常)只有知道子进程终止状态,父进程才能对子进程回收(即回收僵尸进程)。

 

  •  措施

wait()或waitpid()      

 

 

8.waitwaitpid

#include <sys/wait.h>

pid_t wait(int *status);

pid_t waitpid(pid_t pid, int *status, int options);

返回值:若成功返回进程ID,若出错返回-1

 

    调用waitwaitpid的进程可能发生的情况有:

  •  如果所有子进程都还在运行,则阻塞(Block)
  •  如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回。(僵尸进程的处理)
  •  如果它没有任何子进程,则立即出错返回。

 

  •  在一个子进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞。
  •  waitpid并不等待在其调用之后的第一个终止的子进程。它有若干个选项,可以控制它所等待的进程。

       如果一个子进程已经终止,并且是一个僵尸进程,wait立即返回并取得该子进程的状态status,否则wait使其调用者阻塞直到一个子进程终止。如果调用者阻塞并且它有多个子进程,则在其一个子进程终止时,wait就立即返回。因为wait返回终止子进程的ID,所以总能了解到是哪一个子进程终止了。

waitpid参数说明:

 

终止状态

WIFEXITED、WEXITSTATUS这几个宏用来获取子进程的退出状态。

  • W IF EXITED宏用来判断子进程是否正常终止(return、exit、_exit退出)
  • W EXIT STATUS宏用来得到正常终止情况下的进程返回值的。

 

 

//   8wait.c

猜你喜欢

转载自blog.csdn.net/j_xianyu/article/details/81840097
今日推荐