美文网首页
一、多进程操作的基本函数

一、多进程操作的基本函数

作者: 循环不计次 | 来源:发表于2019-05-23 19:33 被阅读0次

    1.fork

    函数头文件及函数原型

    #include <unistd.h>

    pid_t fork(void);

    在Linux中创建一个新进程的唯一方法是使用fork()函数。

    fork()函数是Linux中一个非常重要的函数,用于从已存在的进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。

    使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程的上下文、代码段、进程堆栈、内存信息、打开的文件描述符、符号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制、信号处理方式和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。

    实际是在父进程中执行fork()函数时,父进程会复制一个子进程,而且父子进程的代码从fork()函数的返回开始分别在两个地址空间中同时运行,从而使两个进程分别获得所属fork()函数的返回值,其中在父进程中的返回值是子进程的进程号,而在子进程中返回0,若出错返回-1。也就是说,父进程调用fork会返回非0和-1的值,而子进程会返回0,fork失败时返回-1。可以根据返回值判断是父进程还是子进程。


    2.exit与_exit

    进程的终止分为两种:异常终止和正常终止

    异常终止的情况包括:①进程收到某种信号;②调用abort()函数;

    正常终止的情况包括:①main()函数return;②调用exit()或_exit()函数;

    exit函数与_exit函数的区别:

    1.exit()函数执行时会无条件停止剩下的所有操作,清理包括PCB在内的各种数据结构,并终止本进程的运行,在执行推出之前加了若干道工序,它要检查文件的打开情况,把文件缓冲区的内容写回文件,即“清理I/O缓冲”。

    _exit()函数的作用是直接使进程停止运行,清除其使用的内存空间,并清楚其在内核中的数据结构。

    调用_exit()函数时,缓冲区的记录无法输出。

    调用exit()函数时,缓冲区的记录也能正常输出。调用exit()之后,该进程并不会马上完全消失,而是留下了一个成为僵尸(Zombie)的数据结构。

    3.wait和waitpid

    作用:暂时停止目前进程的执行, 直到有信号来到或子进程结束。

    函数头文件及函数原型

    #include <sys/types.h>

    #include <sys/wait.h>

    pid_t wait(int *status);

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

    wait()函数用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或该进程接收到一个指定的信号为止。如果该父进程没有子进程或它的子进程已经结束,则wait()就会立即返回。其中参数status整型指针是子进程退出时调用exit或_exit使用的参数

    waitpid()的作用和wait()一样,但它并不一定要等待一个终止的子进程,它还有若干选项,如可提供一个非阻塞版本的wait()功能,也能支持作用控制。实际上,wait()函数只是waitpid()函数的一个特例,在Linux内部实现wait()函数时直接调用的就是waitpid()函数。

    参数pid 为欲等待的子进程识别码, 其他数值意义如下:

    1、pid<-1等待进程组识别码为pid 绝对值的任何子进程。

    2、pid=-1等待任何子进程, 相当于wait()。

    3、pid=0等待进程组识别码与目前进程相同的任何子进程。

    4、pid>0只等待任何子进程识别码等于pid 的子进程,不管是否有其他子进程结束, 只要指定子进程未结束,一直等。

    参数option 可以为0或下面的OR 组合:

    WNOHANG: 如果没有任何已经结束的子进程则马上返回, 不予以等待。

    WUNTRACED:如果子进程进入暂停执行情况则马上返回, 但结束状态不予以理会.子进程的结束状态返回后存于status。

    4.判别结束情况的函数:

    WIFEXITED(status): 用来指出子进程是否为正常退出的,如果是,它会返回一个非零值。

    WEXITSTATUS(status):取得子进程exit()返回的结束代码, 一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。 可以用这个宏来提取子进程的返回值,如果子进程调用exit(5)退出,  WEXITSTATUS(status)就会返回5;如果子进程调用exit(7)退出, WEXITSTATUS(status)就会返回7。如果进程不是正常退出, 也就是说,WIFEXITED返回0,这个值就毫无意义了。

    WIFSIGNALED(status):如果子进程是因为信号而结束则此宏值为真。

    WTERMSIG(status): 取得子进程因信号而中止的信号代码, 一般会先用WIFSIGNALED 来判断后才使用此宏。

    WIFSTOPPED(status): 如果子进程处于暂停执行情况则此宏值为真. 一般只有使用WUNTRACED时才会有此情况。

    WSTOPSIG(status): 取得引发子进程暂停的信号代码, 一般会先用WIFSTOPPED 来判断后才使用此宏。

    相关文章

      网友评论

          本文标题:一、多进程操作的基本函数

          本文链接:https://www.haomeiwen.com/subject/heabzqtx.html