Linux进程与线程之四

2024-05-19 10:18
文章标签 linux 线程 进程 之四

本文主要是介绍Linux进程与线程之四,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


                     每日一结

一 传统的进程间通信 

1.信号 : 异步进程间通信方式 

 

信号是对中断机制的一种模拟 

进程对信号处理方式:

(1)忽略信号 

SIGKILL ,SIGSTOP 不能忽略 

(2)捕捉 : 信号到达的时候,执行信号处理函数 

(3)缺省操作 : 系统默认的操作 

大部分信号默认的操作都是杀死进程,SIGCHLD 进程默认忽略。

SIGCHLD在子进程状态发生改变的时候,发送父进程 。

 

2.设置进程对信号的处理方式 

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

参数:

@signum    信号序号 

@handler   SIG_IGN:忽略  SIG_DFL:默认的处理方式   函数名:捕捉 

返回值:

成功返回处理函数的入口地址,失败返回SIG_ERR 

注:查看一下man page,解释一下其中的参数,以及总结一下,对于这类参数,该怎么去看。

 

练习:

回收僵尸态子进程,父进程不能轮询,不能阻塞 ?

(1).创建一个子进程,睡眠3s后退出 

(2).父进程每隔1s输出一个字符串 

wait / waitpid

 

3.设置闹钟 

unsigned int alarm(unsigned int seconds);

功能:给进程启动一个定时器,定时器时间达到,内核会向进程发送SIGALRM 

参数:

@seconds  秒 

返回值:

成功返回0,失败返回 -1 

练习:

探测用户有没有输入,如果3s内用户没有输入,则超时一次 ,如果超时三次进程自动结束 

代码示例如下:



 

代码分析如下:

思考一下,其整个进程运行的流程

 

4.挂起进程 

int  pause(void);

特点:挂起一个进程,直到进程收到一个信号,进程会继续执行 


代码示例如下:


分析其原因:

 

 

注意:对于这个程序的运行结果,自己好好思考一下

 

注意:大部分信号对进程的默认操作都是杀死进程,此时必须设置进程对信号处理方式为捕捉 

 

信号是个什么东西?信号是怎么进行进程间通信的?

信号是在软件层次上对中断机制的一种模拟。在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的:一个进程不必通过任何操作来等待信号的到达。事实上,进程也不知道信号到底什么时候到达。信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了那些系统事件。他可以在任何时候发给某一进程,而无需知道该进程的状态。如果该进程当前并未处于执行态,则该信号就有内核保存起来,知道该进程恢复执行再传递给它为止;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,知道其阻塞被取消时才被传递给进程。信号是进程间通信机制中唯一的异步通信机制。

 

怎么区分同步通知和异步通知?

信号可以直接进行用户空间进程和内核进程之间的交互

 

同步和异步的区别:
1、同步就是说多个任务之间是有先后关系的,一个任务需要等待另一个任务执行完毕才能继续执行。
2、异步就是说多个任务之间没有先后关系,不需要相互等待各做各的事。

同步编程方法:
1、信号量
2、互斥量

异步无需考虑资源冲突,不需特别处理。


关于Linux环境进程间通信的参考资料(二): 信号
上:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html
下:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html


二 IPC对象 

1.消息队列 

(1)创建消息队列 

int msgget(key_t key, int msgflg);

功能:获取指定的key值的消息队列ID

参数:

@key  

<1>IPC_PRIVATE:每次都会创建一个新的消息队列 [用在亲缘关系的进程间通信]

<2>ftok函数获的key [用在非亲缘关系进程间通信]

key_t ftok(const char *pathname, int proj_id);

功能:根据文件的ID 和 proj_id的低8bit产生一个key值 

参数:

@pathname  一个文件名 

@proj_id   一个字符

返回值:

成功返回key,失败返回-1 

 

@msgflg :IPC_CREAT , IPC_EXCL

IPC_CREAT | 0666  -> 如果执行的key的消息队列不存在,则创建新的消息队列 

IPC_CREAT | IPC_EXCL -> 判别指定key的消息队列是否存在,如果存在则报错 

返回值:

成功返回消息队列ID,失败返回-1

--------------------------------------------------

通过命令查看IPC对象:

ipcs  -m/-s/-q

m:共享内存对象

s:信号灯集对象 

q:消息队列对象 

ipcrm -m/-s/-q  ID 

删除IPC对象 

--------------------------------------------------

(2)添加消息 

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

参数:

@msqid  消息队列的ID 

@msgp   消息存放的地址 

@msgsz  消息正文的大小 

@msgflg 0:阻塞的方式调用   IPC_NOWAIT:非阻塞的方式调用 

 

返回值:成功返回0,失败返回-1 

-----------------------------------------------------------

消息结构体:

typedef struct 

{

//第一个字段必须是消息类型

long type;

//消息正文部分 

char buf[1024];

int pid;

..

}MSG;

 

//计算消息正文的大小 

#define MTXT_SIZE  (sizeof(MSG) - sizeof(long))

-----------------------------------------------------------

MSG msg;

 

msg.type = 100;

fgets(msg.buf,sizeof(msg.buf),stdin);

msg.pid = getpid();

 

msgsnd(msgid,&msg,MTXT_SIZE,0);

 

(3)接受消息

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);

参数:

@msqid  消息队列的ID 

@msgp   消息存放的地址 

@msgsz  消息正文的大小 

@msgtyp 消息的类型

@msgflg 0:阻塞的方式调用   IPC_NOWAIT:非阻塞的方式调用 

返回值:成功返回接受的消息正文大小,失败返回-1 

 

练习:

A,B进程通过消息队列通信[A,B进程没有亲缘关系]

示例如下:

 

进程A:




 

 

 

进程B:




 

代码分析如下:

 

关于Linux环境进程间通信的参考资料:

消息队列
http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/

 

Linux下进程间通信方式的概述:

I.传统的进程间通信方式

有名管道(pipe),有名管道(fifo)和信号(signal)

II.system V IPC对象

共享内存(share memory),消息队列(message queue)和信号灯(semaphore)

III.BSD

套接字(socket)




关注微信公众号获取更多资讯


这篇关于Linux进程与线程之四的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/995815

相关文章

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected