Linux 进程学习
1、linux进程间通讯
继承unix进程间通讯:管道 信号
AT&T :system V IPC 通讯进程只能在单个计算机 :信号量 消息队列 共享内存
BSD:形成了基于socket的进程间通讯机制 TCP/IP
2、管道
(1)无名管道:父子进程
#include <unistd.h>
int pipe(int pipefd[2]);
创建一个管道
fd[0]:读端
fd[1]:写端
返回值:
0:成功
-1:失败
注意:(1)当管道已经满了 write pipe 会阻塞
(2) 当管道为空 read pipe 会阻塞
(2)有名管道:任何进程之间
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
3、信号
信号在软件层次上对中断的一种模拟 异步通讯方式
中断:对cpu上的中断 (硬件)
信号:对进程的中断 (软件)
(1)信号的来源
(1)程序执行错误 如 内存访问越界
(2)其他进程发送
(3)通过控制终端发送 ctrl + c;
(4)子进程结束向父进程发送信号 SIGCLD
(5)定时器SIGALRM
(2)信号
kill -l 查看当前系统所有的信号
(3)信号处理方式
忽略信号:对信号不做任何处理
捕捉信号:定义处理函数 当信号发生的时候 执行相应的处理函数
缺省操作:在linux系统中间都规定了默认操作
(4)信号的发送与捕捉
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
pid:接受信号的进程的PID
sig:信号
返回值:0:成功
-1:出错
int raise(int sig);
//kill(getpid(),SIGSTOP);
给进程本身发送信号
(5)定时器的信号捕捉
unsigned int alarm(unsigned int seconds);
进程定时器
定时时间到 发送SIGALRM
SIGALRM:默认操作:终止进程
返回值:
在调用之前 如果已经设置过闹钟 返回上一次的剩余时间
否则返回0
-1:出错
int pause(void);
暂停进程
当收到信号时 会唤醒进程继续执行
(6)信号处理
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
参数:
signum:信号
handler:SIG_IGN:忽略该信号
SIG_DFL:采用默认方式处理信号
自定义的信号处理函数的指针
返回值:返回一个指向信号处理函数的地址
1)父进程捕捉子进程的信号
2)从终端输入文字再次输出到终端,如果3s没有输入就输出提示
//SIGALRM
alarm()和signal()
4、信号的阻塞处理
(1)通知系统内核停止向进程发送指定的信号
(2)内核对进程接收到的相应的信号进行缓存
(3)当进程解除相应的信号的阻塞
设置阻塞的原因:
(1)正在执行信号处理函数时有其他的信号到来
(2)信号处理函数和其他进程对某个共享区域进行读写
sigset_t:信号集
int sigemptyset(sigset_t *set);
把信号集合清空
int sigfillset(sigset_t *set);
把信号集合填满
int sigaddset(sigset_t *set, int signum);
把对应的信号加到阻塞信号集合中
int sigdelset(sigset_t *set, int signum);
把对应的信号从阻塞信号集合中删除
int sigismember(const sigset_t *set, int signum);
判断信号是否是在阻塞信号集合中
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
//设置阻塞信号集合
how:设置信号阻塞掩码的方式
SIG_BLOCK:阻塞信号集
SIG_UNBLOCK:解除信号集
SIG_SETMASK:设置阻塞掩码
oldset:旧的阻塞集合
int sigpending(sigset_t *set);
//获取阻塞的信号 未决信号
int flag = 0;
int flag = 1;
while(flag == 0){
int sigsuspend(const sigset_t *mask);
}
//等待信号
(1)设置信号掩码并阻塞进程
(2)收到信号 恢复原来的屏蔽字
(3)调用进程设置的信号处理函数
(4)等待信号处理函数返回后 sigsuspend()返回
原子操作
pause() -----等待信号(阻塞的信号除外)
5、消息队列
(1)消息的列表
队列ID
消息ID
(2)创建
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
key:指定的ID来生成队列ID key:ftok()通过转换文件来获取
msgflg:IPC_CREAT:创建新的消息队列
IPC_EXCL:存在报错
IPC_NOWAIT:非阻塞
返回值:返回队列ID
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
功能:获取key
pathname:文件名---->inode节点号
proj_id:自己指定
由inode节点号和proj_id合成
65538:0x10002
38:0x26
key: 0x2610002
(4)接收消息
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
参数:
msqid:消息队列ID ----- msgget()
msgp:消息的缓冲区
msgsz:消息结构的大小
msgtyp:0:接收消息队列中的第一个消息
大于0:接收消息队列中第一个为msgtyp的消息
小于0:接收消息队列中第一个不小于msgtyp的绝对值由最小的消息
msgflg:
0:忽略
MSG_NOERROR:接收的消息大于size 则消息就会截短到size字节 不通知消息发送进程
IPC_NOWAIT:没有指定类型的消息 就会返回错误ENOMSG
返回值:实际接收的字节数
会删除对应的消息
(5)发送消息
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
参数:
msqid:消息队列ID ----- msgget()
msgp:发送的消息缓冲区
struct msgbuf{
long mtype;//消息类型
char mtext[1];//消息内容
};
msgsz:消息内容的大小
msgflg:
IPC_NOWAIT:发送条件不满足的时 就会立即返回
a):队列消息已经满了
创建2个子进程 父进程负责发送 子进程1:发送类型为1的消息 子进程2:发送消息类型为2的消息
子进程1接收类型为1的消息
子进程2接收类型为2的消息
(5)控制函数
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
msqid:消息队列ID
cmd:
IPC_STAT:获取struct msqid_ds结构 保存到buf
IPC_SET:设置struct msgqid_ds结构
IPC_RMID:删除消息队列
buf:存储struct msqid_ds结构
返回值:成功:0(IPC_STAT,IPC_SET,IPC_RMID)
失败:-1
Linux 进程学习的更多相关文章
- Linux进程学习(孤儿进程和守护进程)
孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程如 ...
- Linux进程学习 - 孤儿进程和守护进程
孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程如 ...
- linux进程学习笔记
学习了linux下的进程,觉得应该整理一下,忘得差不多了,顺便回顾一下. 学而时习之,不亦说乎~~ 进程笔记 ,什么是进程? The Single UNIX Specification, Versio ...
- Linux 进程学习笔记
1.什么是程序?什么是进程?它们有什么区别? 定义: 程序:程序(Program)是一个静态的命令集合,程序一般放在磁盘中,然后通过用户的执行来触发.触发后程序会加载到内存中成为一个个体,就是进程. ...
- linux 进程学习笔记-进程ID,PID
PID,进程号 , 范围在2~(??为什么需要这么多),而一个名为idle (或swapper)的进程占据的编号0,init进程占据了编号1. 进程0和进程1 : 系统启动时会从无到有地创建进程0,它 ...
- linux进程学习-进程描述符的存储
当进程被新建时,内核会给进程分配一个8K的空间作为进程的内核堆栈.同时我们知道task_struct结构体也会被创建,但有意思的是,内核不会给task_struct单独分别空间,而是直接将其扔到8k的 ...
- linux 进程学习笔记-进程调度
在分时系统中,系统将CPU时间划分成无数个时间片(quantum)分配给不同的进程,一个时间片只执行一个进程,并且不停地切换,以让用户感觉到各个进程是在“同时运行”,这中间所需要的策略和算法便是进程调 ...
- linux 进程学习笔记-进程跟踪
进程跟踪 long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); Linux用ptrace来进行进 ...
- linux 进程学习笔记-进程信号sigal
信号(或软中断)是在软件层次上对中断的一个模拟,其运行在“用户空间”,一个进程对另外一个或几个进程通过发送信号来实现异步通信.当接收进程接收到信号后,其可以注册一下处理函数来说对这些信号进行处理(也可 ...
随机推荐
- win10更换登陆背景和关闭锁屏
更换登陆背景图 用国外一个hacker写的工具,可在github上下载,或者下载我上传到百度网盘的备份.win10默认的登陆背景太难看了. 去掉锁屏图片 登陆界面其实本身就是一种锁屏,为什么还要单独搞 ...
- Java学习笔记(十三一)——Xml 常用知识总结
[前面的话] 在学习spring框架,发现很多地方都用到了Xml的知识,所以会过头来再学习学习Xml. 本章学习的是Xml的基础,所以基础性文章,选择性阅读. [Xml] 一.Xml初步了解 XML ...
- [BZOJ4025] 二分图 LCT/(线段树分治+并查集)
4025: 二分图 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2667 Solved: 989[Submit][Status][Discuss] ...
- 关于在C#对类的属性理解
在类中都有一些成员.什么是类中的成员呢,我个人理解的是一个类中所应有的属性,方法,字段(因为目前才接触到类.所以类中一些其它应有的东西还不太熟悉),现在只探讨我列举的这几个在类中应有的东西.什么是属性 ...
- gulp之压缩css,less转css,浏览器实时刷新【原创】
gulp入门 gulp浏览器实时同步 首先要下载对应的插件包: gulp-less包:cnpm install gulp-less --save-dev gulp-connect包:cnpm inst ...
- POJ 1985.Cow Marathon-树的直径-树的直径模板(BFS、DFS(vector存图)、DFS(前向星存图))
Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 7536 Accepted: 3559 Case ...
- vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用
本文简单分析了代码的结构.有助于理解. 转:http://www.freebuf.com/news/141442.html 0×01 事件分析 2017年7月19 unamer在其github上发布了 ...
- Struts2 + Hibernate3.3 开发简单的登录注册功能【J2EE】
开发环境: IDE:Myeclipse10.0 数据库:Oracle(SQL Developer) Web容器:Tomcat 7.0 JDK:1.6 Struts:2.0 Hibernate:3.3 ...
- upm配置文件
组件配置说明 Ø 配置文件规范 Ø 组件分为公共组件和私有组件,分别在public段和private段,如下所示. <?xml version="1.0" encoding= ...
- 离线情报分析工具CaseFile
离线情报分析工具CaseFile CaseFile是Maltego的姊妹工具,功能非常类似于Maltego.CaseFile主要针对数据进行离线分析,缺少Maltego的数据采集功能.它可以导入各 ...