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

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

作者: 循环不计次 | 来源:发表于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 来判断后才使用此宏。

相关文章

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

    1.fork 函数头文件及函数原型#include pid_t fork(void); 在Linux中创建一个新...

  • socket的简单使用

    1、网络中进程之间如何通信? 2、Socket是什么? 3、socket的基本操作 3.1、socket()函数 ...

  • php进程认识

    1、基本认识php系统提供了pcntl_fork 函数来操作进程。pcntl_fork:当前进程位置产生分支(子进...

  • OS库的使用

    OS库提供通用的,基本的操作系统交互功能。 -OS库是Python标准库,包含几百个函数-常用路径操作,进程管理,...

  • python常用知识

    多线程,多进程,协程进程池 协程 字典 列表 函数 文件操作

  • Linux Kernel学习005——进程管理(一)

    Linux Kernel学习005——进程管理(一) 本节引入进程的概念,进程是操作系统中最基本的抽象概念。操作系...

  • LInux-基本指令

    1.基本文件和目录的操作 2.系统,进程,网络 系统操作 进程操作 网络操作 3.其他工具 日期

  • Python之进程

    >什么是进程 在一个正在运行的程序中,代码和调度的资源称为进程,进程是操作系统分配资源的基本单元之前有提到过,多任...

  • Day14

    内存管理 程序是静态的,进程是动态的 进程空间图示 栈内存 堆内存 基本概念 malloc函数 memset函数 ...

  • 线程 & 进程

    进程和线程都是操作系统所有的程序运行的基本单元,操作系统利用该基本单元实现操作系统对应用的并发性。 进程和线程的主...

网友评论

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

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