文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

linux系统编程(3)

2023-01-31 01:49

关注

一 线程间同步

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯