多进程编程.

Slides:



Advertisements
Similar presentations
实验二 Linux 线程及信号灯 一、目的 了解并掌握 Linux 线程及信号灯。 二、要求 1 、了解 Linux 线程与信号灯使用: ( 1 ) Linux 线程 ( 2 ) Linux 信号灯 ( 3 )线程互斥 ( 4 )线程同步.
Advertisements

Linux 环境及 Shell 程序 操作系统实验 1. 二、 Shell 编程与进程通信 常用 shell 命令 文件及文件属性操作 ls 、 cp 、 mv 、 rm ln 、 ln –s 、 chmod 、 groupadd 、 useradd 输入输出操作 echo 、 cat >> 、
天水圍的體育設施.
河內塔(Hanoi)問題.
C语言程序设计 主讲教师 :张群燕 电话:
第1单元 操作系统概论 第一节 绪论 操作系统定义.
第十章 UNIX系统内核结构 10.1 UNIX系统概述 10.2 进程的描述和控制 10.3 进程的同步与通信 10.4 存储器管理
行程(process).
第一章 C语言概述 计算机公共教学部.
新北市廠商聯合抗旱會議 104年3月23日.
補充: Input from a text file
C语言基础——指针的高级应用 Week 05.
南京天石软件技术有限公司 陈锺 (QQ: Solaris 10 C编程 南京天石软件技术有限公司 陈锺 (QQ:
C语言程序设计 第十二章 位运算.
高级语言程序设计 主讲人:陈玉华.
chapter 1-Introduction
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
第7章 Linux环境编程.
第四讲 MPI并行程序设计 课程网站:CourseGrading buaa.edu.cn 主讲教师: 赵长海
STRUCTURE 授課:ANT 日期:2010/5/12.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
第九章 结构体和共用体 结构体的定义 结构体的使用 共用体的定义 共用体的使用 主讲:李祥 时间:2015年10月.
第三章 C++中的C 面向对象程序设计(C++).
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.5 任意个整数求和*
进程及进程管理 第4章 进程及进程管理.
程序设计专题一 结构化程序设计与递归函数 主讲教师: 刘新国.
实验、进(线)程同步与通信 一、实验目的 1、掌握Linux系统用户界面中键盘命令的使用。 2、学会一种Linux下的编程环境。
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010
第一章 C++编程简介 丘志杰 电子科技大学 计算机学院 软件学院.
进程操作.
第六章. 系统调度,COW Fork和IPC (lab4)
多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 1. 多维数组元素的地址 先回顾多维数组的性质,可以认为二维数组是“数组的数组”,例 : 定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
THE C PROGRAMMING LANGUAGE
Ch9 Communicating with Hardware
字符串和字符数组 字符串的输入和输出 字符串的基本操作
Linux 文件操作——系统调用和标准 IO 库
实验三 使用Linux高级IPC 陈毅东.
第三节 整数类型.
Struct結構 迴圈
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
实验二、线程同步与通信 一、实验目的 1、掌握Linux下线程的概念; 2、了解Linux线程同步与通信的主要机制;
实验三、共享内存与进程同步 一、实验目的 1、掌握Linux下共享内存的概念与使用方法; 2、掌握环形缓冲的结构与使用方法;
实验三、共享内存与进程同步 一、实验目的与要求 二、实验内容
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
3.5 线程 问题的提出 进程的引入使操作系统得以完成对并发执行的多道程序动态特征的描述和资源共享的管理,因而进程既是调度的基本单位又是资源分配的基本单位。进程所具有的这两个特点构成了程序并发执行的基础,但同时又导致进程切换过程中由于进程映像过大而带来的时空开销。因此,如果系统中创建的进程过多,或进程切换的频率过高,则会使系统效率下降,限制了并发度的进一步提高。
指標
<编程达人入门课程> 本节内容 字符与字符串 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
C语言程序设计 李祥 QQ:
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 类型、对象、运算符和表达式.
陣列 東海大學物理系‧資訊教育 施奇廷.
单片机原理及应用 实践部分 主讲人:刘 强 四川工商学院单片机教学团队 单片机原理及应用 实践部分 主讲人:刘 强
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab7.
教育部特殊教育通報網 學生異動、接收操作說明.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第 7 章 进程间的通信.
結構、檔案處理(Structure, File)
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab4.
第十二章 位运算.
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
实验三 Linux文件目录操作 一、目的 二、要求 了解并掌握Linux文件目录结构。 了解Linux文件系统与目录操作:
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
银川社保网上申报 宁夏人力资源和社会保障 网上服务大厅操作
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab7.
《操作系统设计与实现》 Linux系统编程.
隨機函數.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

多进程编程

目的和要求 掌握Linux操作系统的进程创建等操作。 利用Linux操作系统提供的信号量工具实现进程间的同步。 掌握对共享内存的相关操作

进程的相关操作 头文件:#include <unistd.h> 进程创建函数:fork() 子进程中返回0,父进程中返回子进程ID,出错返回-1 。一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。 例:int pid=fork();

LINUX的IPC

LINUX的IPC SYSTEM V的IPC 信号量(semaphore set) 消息队列(message queue) 共享内存(shared memory) shell命令 ipcs, ipcrm访问

LINUX的IPC

创建信号量 头文件:#include <sys/sem.h> int semget(key_t key,int nsems,int semflg); 参数key表示所创建或打开信号量集的键 双方直接设置为一个相同的整数为key值 用IPC_PRIVA让系统自动产生一个key值, 用ftok函数将一个路径转换为key值 参数nsems表示创建的信号量集中的信号量的个数,该参数只在创建信号量集时有效,几乎总是取值为1 参数flag表示调用函数的操作类型,也可用于设置信号量集的访问权限,两者通过or表示,IPC_CREAT, IPC_EXCL

信号量的操作semop() int semop(int semid,struct sembuf*sops,unsign nsops); semid为信号量集引用ID。 sops是一个sembuff结构数组,sembuff结构用于指定调用semop函数所作的操作,其中每个元素表是一个操作,由于此函数是一个原子操作,一旦执行就将执行数组中的所有操作 nsops:信号操作结构的数量,恒大于或等于1。

信号量的操作semop() struct sembuf { unsigned short sem_num; /* 信号量编号 */ short sem_op; /* 信号量操作 */ short sem_flg; /* 操作标志 */ } sem_flg用于对操作进行适当的控制,主要有2个控制标志。 IPC_NOWAIT 当指定的操作不能完成时,进程不等待立即返回,返回值为-1,errno置为EAGAIN。 SEM_UNDO(建议) 进程退出时,执行信号量解除(undo)操作。

P、V操作 s_empty = semget(IPC_PRIVATE,1,IPC_CREAT|IPC_EXCL|0777); int p(int semid) { struct sembuf sops={0,- 1, SEM_UNDO}; return (semop(semid,&sops,1)); } int v(int semid) struct sembuf sops={0, +1,ISEM_UNDO};

信号量的控制 int semctl(int semid,int semnum,int cmd,union semunarg); 第4个参数(可选) union semun{ int val; /*用于SETVAL命令,指明要设置的值*/ struct semid_ds *buf; /*用于IPC_STAT/IPC_IPC_SET命令,用来存放信号量集合数据结构*/ unsigned short *array; /*用于GETALL/SETALL命令,用来存放所获得的或是要设置信号量集合中所有信号量的值*/ } arg;

信号量的控制 “cmd” parameter IPC_STAT: 对指定的信号量标识返回arg.semid_ds结构中的当前值 IPC_SET: 在进程有足够权限的前提下,把信号量集合的当前关联值置为arg.semid_ds结构给出的值 IPC_RMID: 删除信号量集合 SETVAL: 设置信号量集合中由semnum指定的单个信号量的值(设为arg.val)

Linux共享内存

Linux共享内存 头文件:#include <sys/ipc.h> #include <sys/shm.h> 要使用一块共享内存,进程必须首先分配它。随后需要访问这个共享内存块的每一个进程都必须将这个共享内存绑定到自己的地址空间中。当完成通信之后,所有进程都将脱离共享内存,并且由一个进程释放该共享内存块。

分配共享内存 int shmget(key_t key, size_t size, int shmflg); key标识共享内存的键值 shmflg主要和一些标志有关。其中有效的包括IPC_CREAT和IPC_EXCL 。IPC_CREAT 如果共享内存不存在,则创建一个共享内存,否则打开操作。 IPC_EXCL 只有在共享内存不存在的时候,新的共享内存才建立,否则就产生错误

绑定地址空间 void *shmat( int shmid , char *addr , int shmflag ); 参数addr与flag组合说明要引入的地址值, addr为0,表明让内核来决定第1个可以引入的位置。addr非零,并且flag中指定SHM_RND,则此段引入到addr所指向的位置

控制共享内存 int shmctl( int shmid , int cmd , struct shmid_ds *buf ); int shmid:是共享内存的ID。 int cmd: 是控制命令,可取值如下: IPC_STAT 得到共享内存的状态, IPC_SET 改变共享内存的状态 IPC_RMID 删除共享内存 Shmid_ds为共享内存的结构

实例 #include <stdio.h> #include <sys/shm.h> #include <sys/stat.h> #define BUFSZ 4096 int main() {   int segment_id; //共享内存标识   char* shared_memory; //进程的地址空间   int segment_size; /* 分配共享内存 */   segment_id = shmget(IPC_PRIVATE,BUFSZ, IPC_CREAT|IPC_EXCL|S_IRUSR|S_IWUSR ); shared_memory = (char*)shmat(segment_id, 0, 0); /* 确定共享内存的大小 */   printf(“shared memory attached at address %p\n”, shared_memory); shmctl(segment_id, IPC_STAT, &shmbuffer); //得到共享内存的状态

实例 segment_size = shmbuffer.shm_segsz;   printf("segment size: %d\n", segment_size); /* 在共享内存中写入一个字符串 */   sprintf(shared_memory, “Hello, world.”); shmdt(shared_memory); /* 脱离该共享内存块 */ /* 重新绑定该内存块 */   shared_memory = (char*)shmat(segment_id, 0, 0); printf("shared memory reattached at address %p\n", shared_memory);   printf("%s\n", shared_memory); /* 输出共享内存中的字符串 */   shmdt(shared_memory); /* 脱离该共享内存块 */   shmctl(segment_id, IPC_RMID, 0);/* 释放这个共享内存块 */   return 0; }

End of Lab