我的编程空间,编程开发者的网络收藏夹
学习永远不晚

linux系统编程(3)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

linux系统编程(3)

一 线程间同步

同步:相互之间配合完成一件事情
互斥:保证访问共享资源的完整性(有你没我)

POSIX 线程中同步:使用信号量实现

信号量 : 表示一类资源,它的值表示资源的个数

对资源访问:
p操作(申请资源) [将资源的值 - 1]
....
V操作(释放资源) [将资源的值 + 1]

1.定义信号量
sem_t  sem ;

2.初始化信号量
int sem_init(sem_t *sem, int pshared, unsigned int value);
参数:
@sem         信号量
@pshared     0:线程间使用
@value       初始化的信号量的值
返回值:
成功返回0,失败返回-1

3.P操作
int sem_wait(sem_t *sem);

4.V操作
int sem_post(sem_t *sem);

二 进程间通信(进程间数据交互)

(1)传统进程间通信方式
  [1]无名管道
  [2]有名管道
  [3]信号

(2)System 5 IPC对象进程间通信方式
  [1]消息队列
  [2]共享内存
  [3]信号灯集

(3)socket通信

(4)Android系统中增加Binder进程间通信方式

Linux 支持以上所有进程间通信方式

三 管道进程间通信

(1)无名管道
特点:
只能用于具有亲缘关系进程间通信(具有亲缘关系的进程具有数据拷贝动作(复制父进程创建子进程))

int pipe(int pipefd[2]);
功能:创建一个无名管道
参数:
@pipefd  获取操作无名管道的文件描述符  pipefd[0]:读无名管道 pipefd[1]:写无名管道
返回值:
成功返回0,失败返回-1


(2)管道读写规则 
读端存在  ,写管道 ---->只要管道没有满,都可以写入数据到管道
读端不存在,写管道 ---->此时写管道没有意义,操作系统会发送SIGPIPE杀死写管道的进程

写端存在,  读管道 ---->此时管道中读取数据,管道中没有数据,读阻塞
写端不存在,读管道 ---->此时管道中读取数据,管道中没有数据,此时不阻塞,立即返回,返回值0

(3)有名管道
特点:可以用于任意进程间通信,它是一种特殊的文件,在文件系统存在名字,
     而文件中存放的数据是在内核空间,而不是在磁盘上

1.创建一个有名管道文件
int mkfifo(const char *pathname, mode_t mode);
@pathname  有名管道存在的路径
@mode      有名管道的权限
返回值:
成功返回0,失败返回-1

2.打开有名管道文件

open

如果有名管道的一端以只读的方式打开,会阻塞,直到另一端以写(只写或读写)的方式打开
如果有名管道的一端以只写的方式打开,会阻塞,直到另一端以读(只读或读写)的方式打开


3.读写操作 
read /write

4.关闭管道文件
close(fd);


四 信号

信号是异步进程间通信方式

进程对信号的响应方式:
<1>忽略
  SIGKILL 和 SIGSTOP 不能忽略

<2>捕捉
  当进程收到信号,此时执行的信号处理函数 

<3>默认
  大部分信号对进程的默认操作方式都是杀死进程
  子进程状态发生改变的时候,操作系统向父进程发送SIGCHLD,默认对它处理方式是忽略

typedef  void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
功能:设置进程对信号处理方式
参数:
@signum  信号的编号
@handler
 SIG_IGN : 忽略信号
 SIG_DFL : 使用默认处理方式
 函数名  : 捕捉方式处理

返回值:
成功返回handler,失败返回SIG_ERR

练习:
如何进行不阻塞,不轮训方式回收僵尸态子进程


2.在进程中设置一个定时器

unsigned int alarm(unsigned int seconds);
参数:
@seconds 定时的时间,以秒为单位

注意:
一旦定时时间完成,操作系统就会向进程发送SIGALRM信号


A进程:
读文件,写管道

A进程结束条件:文件没有数据可读

B进程:
读管道,写文件

B进程结束条件:在写端关闭,读端不阻塞,如果管道中没有数据,读管道会返回0
 


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

linux系统编程(3)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

linux系统编程(3)

一 线程间同步 同步:相互之间配合完成一件事情 互斥:保证访问共享资源的完整性(有你没我) POSIX 线程中同步:使用信号量实现 信号量 : 表示一类资源,它的值表示资源的个数 对资源访问: p操作(申请资源) [将资源的值 -
2023-01-31

Linux下C编程(3)

创建一个能用的SOCKET是非常简单的,因为GLIBC已经为你做了很多简化工作,但是从另一个角度来说,一个通用的SOCKET不代表一个高效性能的网络应用。我们前面说到sockfd其实同真正的FD是一样的。都是LINUX下的一个打开的设备描述
2023-01-31

Linux的文件系统(3)

本章学习目标:掌握Linux下文件目录的属性掌握Linux下的权限管理掌握如何切换用户身份及权限委派   3.1文件系统简介文件系统(File system)泛指储存在计算机上的文件和目录。文件系统可以有不同的格式,叫做文件系统类型(fil
2023-01-31

linux 的文件系统 (3)

上篇博文已经讲解了 如何对磁盘进行分区。接下来我们就在分区上创建文件系统。linux 下用 mkfs 来创建文件系统         用法 :            mkfs  -t  文件系统类型  设备名称   创建 ext3 文件系统
2023-01-31

Linux系统编程之进程介绍

我们平时写的 C 语言代码,通过编译器编译,最终它会成为一个可执行程序,当这个可执行程序运行起来后(没有结束之前),它就成为了一个进程。一、进程概述
2023-06-05

linux系统下udp编程实例

以下是一个简单的UDP编程实例,用于在Linux系统上发送和接收UDP数据包。```c#include #include #include #include #include #define BUF_SIZE 1024void error_
2023-09-20

初学linux系统管理3

在多台linux主机上执行相同的命令By tianjing on 2011 年 06 月 05 日有时候我们需要在若干台linux主机上执行相同的命令,或者安装相同的软件,可以使用如下两种方法:实验环境,有9台RHEL5.5_x64的主机,
2023-01-31

Linux系统编程规范有哪些

这篇文章给大家介绍Linux系统编程规范有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.1 系统调用概述系统调用是操作系统内核提供给应用程序的基础接口,需要运行在操作系统的核心模式下,以确保有权限执行某些 CP
2023-06-16

linux shell编程学习笔记(3)

1、什么是变量保存变化的数据——变量名:名称固定,由系统预设或用户自定义——变量值:根据用户设置、系统环境变化而变化2、如何定义变量——变量名=变量的值2.1变量名的规则(1)数字、字母、下划线(2)字母区分大小写(3)当变量名相同时,后赋
2023-01-31

如何解析Linux系统多线程编程

这篇文章的内容主要围绕如何解析Linux系统多线程编程进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!Linux下的多线程编程1 引言  线程(thr
2023-06-28

Linux系统编程中的网络编程基础是什么

这篇文章主要为大家分析了Linux系统编程中的网络编程基础是什么的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Linux系统编程中的网络编程基础是什么”的知
2023-06-28

linux之系统编码,python编码,

如果你对python2和python3的中编解码很清楚,这里我认为你很清楚。具体参考文档:“python2 encode和decode函数说明.docx”“字符编码——从ASCII开始.docx”以上所有文档均为本地文档。sys.getde
2023-01-31

Linux系统怎么修改系统编码

这篇文章主要介绍了Linux系统怎么修改系统编码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Windows的默认编码为GBK,Linux的默认编码为UTF-8,在Windo
2023-06-28

浅谈Linux环境变量与系统编程

目录1、基本概念:2、环境变量的操作:(1)、对于环境变量的基本操作命令如下:(2)、如何使得修改长期有效,并且不会覆盖原有路径?3、环境变量与环境表:4、如何用函数来对环境变量修改?1、基本概念: 环境变量(environment var
2023-05-06

Linux系统中Shell编程的示例分析

这篇文章主要介绍Linux系统中Shell编程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一. 什么是Shell 1. 在学习Shell编程之前,我们应该要先知道什么是Shell用户、She
2023-06-26

Linux系统编程exit函数使用细节

在Linux系统编程中,exit()函数是一个重要的库函数,用于正常终止进程函数原型:#include void exit(int status);status参数表示进程退出状态。通常情况下,0表示成功,非0值表示出
Linux系统编程exit函数使用细节
2024-09-09

Linux系统编程常用命令有哪些

这篇“Linux系统编程常用命令有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux系统编程常用命令有哪些”文章吧
2023-06-28

如何分析Linux系统中的socket编程

这篇文章跟大家分析一下“如何分析Linux系统中的socket编程”。内容详细易懂,对“如何分析Linux系统中的socket编程”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“如
2023-06-28

编程热搜

目录