加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

OSLab多进程

发布时间:2020-12-14 01:52:18 所属栏目:Linux 来源:网络整理
导读:日期:2019/3/23 内容:Linux下与多进程相关的函数。 ? ? 进程基本知识 定义 应用程序关于某数据集合上的一次运行活动。 特点 ·操作系统进行资源分配和调度的基本单位 ·进程是程序的一次执行过程。进程是动态的,程序是静态的。 ·同一程序同时运行于若干

日期: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: [email?protected]

????> 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 = %dn",getpid(),getppid());

????else

????????printf("In parent process: parent pid = %d,child pid = %dn",pid);

????wait(NULL);

????return 0;

}

?

/*

* 父进程先于子进程退出

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

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

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

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

*/

?

?

  • 并发特性与隔离特性

并发

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

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

隔离

·地址空间隔离,仅能访问自己的地址空间

·出现非法访存,只影响当前进程

·全局变量也不共享

?

并发和隔离样例代码

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

????> File Name: concurrency.c

????> Author: sinkinben

????> E-mail: [email?protected]

????> Created Time: Sat 23 Mar 2019 08:38:19 AM CST

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

?

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

static int global = 0;

void child()

{

????int i = 0;

????for (i = 0; i < 5; i++)

????{

????????puts("child");

????????printf("global = %dn",global++);

????????sleep(1);

????}

}

void parent()

{

????int i = 0;

????for (i = 0; i < 5; i++)

????{

????????puts("parent");

????????printf("global = %dn",global++);

????????sleep(1);

????}

}

?

int main()

{

????pid_t pid = fork();

????if (pid)

????????parent();

????else

????????child();

????return 0;

}

?

运行结果

exec系列

名词解析:

exec:execute

l:list,表示参数是列表形式

v:vector,表示参数是数组形式

p:path,有p可以使用相对/绝对路径;没p只能绝对路径。

全家桶如下。

函数

头文件

原型

?

execl

unistd.h

int execl(const char *path,const char *arg,...

?
? ? ? ?
? ? ? ?
? ? ? ?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读