linux环境创建信号灯失败,linux系统编程(3)

本文详细介绍了Linux中的线程同步方法,如使用信号量实现资源的互斥访问,以及进程间通信的各种方式,包括无名管道、有名管道、信号、System5 IPC对象等。同时,讨论了管道的读写规则以及信号的处理方式,并提供了实践中的应用示例,如如何不阻塞地回收僵尸进程。此外,还提及了Android系统的Binder通信机制。
摘要由CSDN通过智能技术生成

一 线程间同步

同步:相互之间配合完成一件事情

互斥:保证访问共享资源的完整性(有你没我)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值