中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010

Slides:



Advertisements
Similar presentations
Linux 操作系统分析 中国科学技术大学计算机系 陈香兰( 0512 - ) Autumn 2010.
Advertisements

Ch5 Linux Network Programming Jianjian SONG Software Institute, Nanjing University Nov
Linux 环境及 Shell 程序 操作系统实验 1. 二、 Shell 编程与进程通信 常用 shell 命令 文件及文件属性操作 ls 、 cp 、 mv 、 rm ln 、 ln –s 、 chmod 、 groupadd 、 useradd 输入输出操作 echo 、 cat >> 、
© 2001 孟静制作 版权所有 第二章 CPU 管理和进程、线程管理 2.1 CPU 管理概述 2.2 进程管理 2.3 进程模型实例分析 :UNIX 早期版本的 CPU 管理 子系统 ( 进程模型 ) 2.4 处理机管理实例分析 (2):linux CPU 管理(进程 模型) 2.5 线程模型.
第 3 章操作系统基础 3.1 操作系统概述 3.2 操作系统的功能模块 3.3 典型操作系统概述.
1 实验二、 TCP 、 UDP 通信程序设计实验 ——TCP 通信实验 注意 bind 和 listen socket() bind() listen() accept() write() read() TCP Server read() socket() TCP Client connect()
第九章 文件系统 (一)文件系统的基本概念 (二)文件的逻辑结构与存取方法 (三)文件的物理结构 (四)文件目录结构 (五)文件的共享与保护
第6章 计算机网络基础 信息技术基础.
第十章 UNIX系统内核结构 10.1 UNIX系统概述 10.2 进程的描述和控制 10.3 进程的同步与通信 10.4 存储器管理
第七章 操作系统接口 7.1 联机用户接口 7.2 Shell命令语言 7.3 系统调用 7.4 UNIX系统调用 7.5 图形用户接口.
第一章 C语言概述 计算机公共教学部.
新北市廠商聯合抗旱會議 104年3月23日.
香港普通話研習社科技創意小學 周順強老師.
马志强 软件学院501室 网络应用开发 马志强 软件学院501室
操作系统原理 Principles of Operating System
权力的行使:需要监督 北京市京源学校 冯 悦.
计算机系统安全 第10章 常用攻击手段.
TCP Session Hijack 郭军权
Socket.
基于WinSock的邮件系统 1 设计目标: 1.1 SMTP发送邮件服务器(c语言) 1.2 POP3接受邮件服务器(c语言)
第 5 章 文件I/O操作.
计算机网络实验介绍 信息网络实验室 2017/9/13 04:55:22.
也許你很疑惑: 最近升官的同事,專業能力又沒你強! 情場得意的朋友,長的又沒你帥或美! 小曹要交新朋友,為什麼就是比較簡單!
第7章 嵌入式网络程序设计 本章将学习如何开发嵌入式Linux系统的网络应用程序。  嵌入式系统处理的主要以太网协议和TCP/IP协议;
Advanced Sockets Programming
标准TCP/IP编程接口 ——Socket
TCP、UDP 通信实践 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
C H A P T E R 11 体系结构对操作系统的支持.
chapter 1-Introduction
Socket Programming in C
Socket Programming.
Socket 基本觀念.
Socket () and TCP client-server
第7章 Linux环境编程.
Socket Programming.
多进程编程.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
进程及进程管理 第4章 进程及进程管理.
套接字API调用.
嵌入式系统设计与实例开发 ——ARM与C/OS-Ⅱ 第六讲 基于ARM的嵌入式硬件结构设计.
进程操作.
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
第六章. 系统调度,COW Fork和IPC (lab4)
作業系統實習課(四) -檔案管理- 實驗室:720A 助教:鄧執中.
第2章 套接字网络编程基础 2.1 UNIX套接字网络编程接口的 产生与发展 2.2 套接字编程的基本概念 2.3 面向连接的套接字编程
詩文的形成 有意義的字詞 句子 段落 一首詩文的形成,是由有意義的字詞組成句子,再由句子組成段落。
7.1.1 设备管理的功能(P95) 分配设备:按设备的不同类型和操作系统选用的算法分配。包括分配相应的通道、设备控制器以及对未分配到的任务或怍业进行排队等; 控制和实现真正的输入输出操作。包括通道程序控制、启动设备、及时响应及处理中断讯号等; 对输入输出缓冲区进行管理。例如逻辑名的管理,多个缓冲区的分时以及串并行操作,同类多个外部设备的均衡工作,避免“忙的忙”和“闲的闲”;
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
Westmont College 网络应用软件 第一讲 (客户-服务器 概念, 协议端口的使用, 套接字API)
实验二、线程同步与通信 一、实验目的 1、掌握Linux下线程的概念; 2、了解Linux线程同步与通信的主要机制;
Window Socket 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
Advister: Quincy Wu Speaker: Chenglin Tsai Date:3/26
第1章 网络操作系统概述.
实验三、共享内存与进程同步 一、实验目的 1、掌握Linux下共享内存的概念与使用方法; 2、掌握环形缓冲的结构与使用方法;
实验三、共享内存与进程同步 一、实验目的与要求 二、实验内容
作業系統 第三章 作業系統結構.
面向非连接的 SOCKET编程 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
SOCKET( ).
2019/5/3 JAVA Socket(UDP).
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 类型、对象、运算符和表达式.
1.3操作系统提供的服务和用户接口 操作系统提供的用户接口 程序接口与系统调用 操作接口与系统程序
第 7 章 进程间的通信.
架构师成长感悟 吴隆烽
第十二章 位运算.
助教:廖啟盛 JAVA Socket(UDP) 助教:廖啟盛
实验三 Linux文件目录操作 一、目的 二、要求 了解并掌握Linux文件目录结构。 了解Linux文件系统与目录操作:
第六章 直接成本法.
《操作系统设计与实现》 Linux系统编程.
Presentation transcript:

中国科学技术大学计算机系 陈香兰(0512-87161312) xlanchen@ustc.edu.cn Autumn 2010 Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512-87161312) xlanchen@ustc.edu.cn Autumn 2010

进程间同步和通信

进程间通信 IPC,Inter-Process Communication Unix系统提供的基本的IPC包括: 1、管道和FIFO(有名管道) 2、消息 3、信号量 4、共享内存区 5、套接字 2018/12/8 Linux OS analysis

1、管道(pipe) 管道是所有Unix都提供的一种IPC机制 管道是半双工的,数据只能向一个方向流动; 一个进程将数据写入管道, 另一个进程从管道中读取数据 数据的读出和写入: 写入的内容每次都添加在管道缓冲区的末尾, 每次都是从缓冲区的头部读出数据。 需要双方通信时,需要建立起两个管道; 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 2018/12/8 Linux OS analysis

在shell中使用管道的例子 命令:“ls | more” 使用pipeline “|”将两个命令”ls”和“more”连接起来,使得ls的输出成为more的输入 也可以使用如下的两个命令 命令1:“ls > tmp” 命令2:”more < tmp” 命令1把ls的输出重定向到tmp文件中; 命令2把more的输入重定向到tmp文件 2018/12/8 Linux OS analysis

创建一个管道 管道可看成是被打开的文件,但并没有真实的 文件与之对应 pipe()系统调用用来创建一个新的管道 #include <unistd.h> int pipe(int filedes[2]); 管道两端分别用描述符filedes[0]和filedes[1]描述 管道两端的功能是固定的: filedes[0]只能用于读,称为管道读端; filedes[1]只能用于写,称为管道写端。 若试图从写端读,或者向读端写都将导致错误发生。 一般文件的I/O函数都可用于管道,如close、read、write等 2018/12/8 Linux OS analysis

使用管道的典型程序 testpipe.c 管道只能在具有亲缘关系的进程之间进行通信 任意的两个进程不可能共享同一个管道 通过fork传递管道的描述符 任意的两个进程不可能共享同一个管道 无法打开已经存在的管道 2018/12/8 Linux OS analysis

FIFO 管道的一个重大限制是它没有名字,因此 只能用于具有亲缘关系的进程间通信,在 有名管道(named pipe或FIFO)提出后, 该限制得到了克服。 FIFO,有名管道 特殊的文件类型: 1,严格遵循先入先出的读写规则 2,类似管道,在文件系统中不存在数据块,而是与一块内核缓冲区相关联 3,有名字,FIFO的名字包含在系统的目录树结构中,可以按名访问 2018/12/8 Linux OS analysis

以及:open,close,read,write等普通文件操作 FIFO的操作: 以及:open,close,read,write等普通文件操作 2018/12/8 Linux OS analysis

FIFO举例 创建一个FIFO:createfifo.c 向FIFO写:writefifo.c 从FIFO读:readfifo.c 2018/12/8 Linux OS analysis

createfifo.c 2018/12/8 Linux OS analysis

writefifo.c 2018/12/8 Linux OS analysis

readfifo.c 2018/12/8 Linux OS analysis

2、消息队列 消息队列就是一个消息的链表。 可以把消息看作一个记录,具有特定的格式以及特定的优先级。 对消息队列有写权限的进程可以按照一定的规则向消息队列添加新消息; 对消息队列有读权限的进程则可以从消息队列中读走消息。 2018/12/8 Linux OS analysis

消息队列的创建 int msgget(key_t key, int msgflg) 根据给定的键值,返回对应的消息队列 若能找到,则返回已有的;否则,创建一个新的 2018/12/8 Linux OS analysis

发送消息 int msgsnd(int msqid, //目标消息队列 struct msgbuf *msgp, //待发送的消息 int msgsz, //消息的大小 int msgflg); //标志 对于发送消息来讲,msgflg有意义的标志为 IPC_NOWAIT:指明在消息队列没有足够空间容纳要发送的消息时,msgsnd是否等待 2018/12/8 Linux OS analysis

接收消息 读消息标志msgflg可以为以下几个常量的或: int msgrcv(int msqid, //msqid为消息队列描述字 struct msgbuf *msgp, //消息返回后存储这里 int msgsz, //指定消息内容的长度 long msgtyp, //请求读取的消息类型 nt msgflg); 读消息标志msgflg可以为以下几个常量的或: IPC_NOWAIT:如果没有满足条件的消息,立即返回,此时,errno=ENOMSG IPC_EXCEPT:与msgtyp>0配合使用,返回队列中第一个类型不为msgtyp的消息 IPC_NOERROR:如果队列中满足条件的消息内容大于所请求的msgsz字节,则把该消息截断,截断部分将丢失。 2018/12/8 Linux OS analysis

消息队列的其他操作 对由msqid标识的消息队列执行cmd操作: IPC_RMID:删除消息队列 int msgctl(int msqid, int cmd, struct msqid_ds *buf); 对由msqid标识的消息队列执行cmd操作: IPC_STAT:获取消息队列信息,返回的信息存贮在buf中; IPC_SET:设置消息队列的属性,要设置的属性存储在buf中;可设置属性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同时,也影响msg_ctime成员。 IPC_RMID:删除消息队列 2018/12/8 Linux OS analysis

3、信号量 Semphore,用来对资源进行并发控制访问 通常是一个计数器 当进程需要访问资源,但资源不可用时,将计数值-1,并阻塞 如果资源可用,值>0 如果不可用,值<=0 当进程需要访问资源,但资源不可用时,将计数值-1,并阻塞 当进程释放资源,使得资源有资源可用时,就唤醒被阻塞的进程 2018/12/8 Linux OS analysis

semop用来获取或释放信号量对应的资源 获得信号量集描述符 semop用来获取或释放信号量对应的资源 2018/12/8 Linux OS analysis

对semop中sembuf结构的解释 sembuf中包含下列几个分量: 其中,sem_flg可以是 sem_op的值确定要进行的操作 unsigned short sem_num; //要操作的信号量的序号 short sem_op; //要进行的操作 short sem_flg; //与操作相关的一些标记 其中,sem_flg可以是 IPC_NOWAIT:当期望的操作无法完成时,直接返回 和SEM_UNDO:自动释放标记 sem_op的值确定要进行的操作 >0:释放资源 =0:wait-for-zero <0:申请资源 2018/12/8 Linux OS analysis

Semctl对信号量进行控制,可以用来删除一个信号量 第4个参数可选,是一个union,其含义根据cmd进行解释 union semun { int val; struct semid_ds *buf; unsigned short * array; struct seminfo *__buf; } 2018/12/8 Linux OS analysis

对semctl中cmd等的解释 cmd可以是: IPC_STAT,将信号量集的信息复制到第四个参 数所提示的空间中,此时第四个参数为:struct semid_ds *buf。此时第二个参数无用 IPC_SET,与上一个操作相反 IPC_RMID,删除信号量集,不使用第四个参数 GETALL/SETALL,使用第四个参数:unsigned short* array,获取/设置所有信号量的值 GETVAL/SETVAL,前者使用第4个参数:int val,获得/设置指定信号量的值 GETNCNT、GETPID、GETZCNT 2018/12/8 Linux OS analysis

Cmd使用举例 union semun args; args.val=1; semctl(sem_id,sem_no,SETVAL,args); int i=semctl(sem_id,sem_no,GETVAL); semctl(sem_id,sem_no,IPC_RMID); 2018/12/8 Linux OS analysis

使用信号量互斥 usesem.c 注意:示例程序仅仅是为了说明进程之间的互斥 2018/12/8 Linux OS analysis

4、共享内存 允许两个或多个进程通过把公共数据放入一个共享内存区来访问它们 获得或创建一个共享内存区的IPC标志符 将一个共享内存区“附加”到一个进程上, 使得进程可以访问共享内存区的内容 进程通过shmaddr指定并获得共享内 存区在该进程中的起始地址 2018/12/8 将指定位置的共享内存区从进程中分离出去 Linux OS analysis

两个进程通过共享内存进行通信 testshm.c testshm2.c 2018/12/8 Linux OS analysis

5、套接字socket 套接字不仅可以用来实现网络间的进程通信,也可以用来实现本地的进程间通信 相关调用包括: Socket Listen Bind Connect/accept Send/recv,read/write Close … 2018/12/8 Linux OS analysis

Socket建立一个套接字 对于基于TCP/IP的编程,通常为: sockfd=socket(AF_INET, SOCK_STREAM,0) 2018/12/8 Linux OS analysis

地址绑定 将一个套接字与一个地址绑定 网络地址: struct sockaddr { unsigned short sa_family; char sa_data[14]; }; address family 例如:AF_INET 14 个字节,协议地址 2018/12/8 Linux OS analysis

Internet的地址 struct sockaddr_in { /* for convenience */ short int sin_family; unsigned short int sin_port; /* 2 bytes */ struct in_addr sin_addr;/* 4 bytes */ unsigned char sin_zero[8]; }; sin_port和sin_addr要使用网络字节序,跟主机上的不一定一致,需要转换: htons=host to net short htonl=host to net long 2018/12/8 Linux OS analysis

Server端需要进行地址绑定 int sd; struct sockaddr_in my_addr; sd = socket(AF_INET, SOCK_STREAM, 0); bzero(&(my_addr),sizeof(struct sockaddr_in); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); my_addr.sin_addr.s_addr=INADDR_ANY; bind(sd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)); bind填写了服务器的地址和端口信息,最大的端口值为65535 2018/12/8 Linux OS analysis

服务器调用listen设置侦听 第二个参数指定最多客户数 listen将立即返回 listen(sd,5); 2018/12/8 Linux OS analysis

服务器调用accept接收客户连接请求 Accept将会blocking直到有客户连接 sin_size = sizeof(struct sockaddr_in); newsd = accept(sd, &their_addr, &sin_size); Accept将会blocking直到有客户连接 返回与客户端相关的newsd,并将客户端的信息存放在their_addr中 2018/12/8 Linux OS analysis

TCP服务器编程模型 socket(...); bind(...); listen(...); while(1) //循环服务器         {                 accept(...);                 while(1)                 {                         read(...);                         process(...);                         write(...);                 }                 close(...);         } 2018/12/8 Linux OS analysis

客户端调用connect请求连接 在serv_addr中指明要连接的服务器地址和端口 成功以后,就可以进行send/recv或者read/write了 2018/12/8 Linux OS analysis

struct sockaddr_in dest_addr; sd = socket(AF_INET, SOCK_STREAM, 0); bzero(&(dest_addr),sizeof(struct addr_in)); dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(DEST_PORT); dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); connect(sd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)); 2018/12/8 Linux OS analysis

TCP客户端编程模型 socket(…) connect(…) while(1) { read(…) … write(…) } close(…) 2018/12/8 Linux OS analysis

server.c client.c 2018/12/8 Linux OS analysis