OSLab多进程

日期:2019/3/23

内容:Linux下与多进程相关的函数。

 

 

进程基本知识

  • 定义

应用程序关于某数据集合上的一次运行活动。

  • 特点

·操作系统进行资源分配和调度的基本单位

·进程是程序的一次执行过程。进程是动态的,程序是静态的。

·同一程序同时运行于若干个数据集合上,该程序将对应与若干个不同的进程。

·每个进程拥有独立的地址空间。地址空间包括代码段、数据段和堆栈段。

·进程之间的地址空间是隔离的。一个进程崩溃不会影响另一个进程,一个进程崩溃不会影响到操作系统。(一个程序开了多个进程,全局变量也不会共享)

fork

  • 作用:创建一个子进程
  • 返回值:

在父进程中,fork返回新创建子进程的进程PID;

在子进程中,fork返回0;

如果出现错误,fork返回一个负值;

  • 实现细节

·OS为子进程创建一个PCB(Process Control Block, 进程控制块,其实质是一个结构体)

·复制代码和数据到子进程的地址空间(PID不复制)

  • 获取PID

当前进程

获取子进程PID

获取父进程PID

子进程

getpid()

getppid()

父进程

pid=fork()

getpid()

 

获取PID代码样例

/*************************************************************************

    > File Name: testfork.c

    > Author: sinkinben

    > E-mail: sinkinben@qq.com

    > Created Time: Sat 23 Mar 2019 08:13:00 AM CST

************************************************************************/

 

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/wait.h>

int main()

{

    //pid_t pid = fork();

    pid_t pid;

    pid = fork();

    //sleep(3); //3sec

    if (pid == 0)

        printf("In child process: child pid = %d, parent pid = %d\n", getpid(), getppid());

    else

        printf("In parent process: parent pid = %d, child pid = %d\n", getpid(), pid);

    wait(NULL);

    return 0;

}

 

/*

* 父进程先于子进程退出

* init是1号进程,接管子进程

* 所以in child process, getppid()总是返回1

* 解决办法:父进程调用sleep

* 正解:调用wait,让父进程等待子进程结束

*/

 

 

  • 并发特性

·二者并发运行,输出交织。

·代码段相同:父进程从fork返回处执行(返回值为子进程PID);子进程从fork返回处执行(返回值0)

上一篇:Python 基础入门 10_1 进程线程和协程


下一篇:Python中进程间通信出现(PermissionError: [WinError 5] 拒绝访问。)