首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
系统相关
> 详细
linux系统编程(3)
时间:
2017-12-24 18:40:47
阅读:
185
评论:
0
收藏:
0
[点我收藏+]
标签:
linux系统编程
一 线程间同步
同步:相互之间配合完成一件事情
互斥:保证访问共享资源的完整性(有你没我)
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
linux系统编程(3)
标签:
linux系统编程
原文地址:http://blog.51cto.com/13375232/2054048
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
gitlab 在linux安装环境下存储地址
2021-07-29
当 Mac 未检测到外部显示器时如何修复它
2021-07-29
Ubuntu18.04安装qemu遇到问题-qemu : Depends: qemu-system (>= 1:2.11+dfsg-1ubuntu7)
2021-07-28
[Linux]Shell编程【待续】
2021-07-28
Linux系统资源查看
2021-07-27
Archlinux爬坑指南
2021-07-27
[Linux]Linux发展历程
2021-07-27
非桌面系统 (ubuntu)安装google-chrome
2021-07-27
在Ubuntu18.04系统中源码安装 gcc7.3.0
2021-07-23
Linux快捷键杂记
2021-07-22
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!