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
信号(或软中断)是在软件层次上对中断的一个模拟,其运行在“用户空间”,一个进程对另外一个或几个进程通过发送信号来实现异步通信.当接收进程接收到信号后,其可以注册一下处理函数来说对这些信号进行处理(也可 ...
随机推荐
- Java之CyclicBarrier使用
http://blog.csdn.net/shihuacai/article/details/8856407 1.类说明: 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (commo ...
- hdu 1247 (字典树入门)
Hat’s Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- 半透明AlphaBlend
AlphaBlend 函数功能:该函数用来显示透明或半透明像素的位图. 函数原型: BOOL AlphaBlend( HDC hdcDest, // handle to destination DC ...
- ZIP排除指定目录进行压缩
zip -r glog-0.3.5.zip glog-0.3.5/ -x "glog-0.3.5/doc/*" unzip -v glog-0.3.5.zip 进行查看ZIP的内 ...
- [BZOJ4456] [Zjoi2016]旅行者 分治+最短路
4456: [Zjoi2016]旅行者 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 777 Solved: 439[Submit][Status] ...
- .net core 2.0学习记录(一):搭建一个.Net Core网站项目
.Net Core开发可以使用Visual Studio 2017或者Visual Studio Code,下面使用Visual Studio 2017搭建一个.net Core MVC网站项目. 一 ...
- html和url两种录制方式
在跟使用Loadrunner工具使用者交流的过程中,经常有人提到这个问题,基于HTML(HyperText Markup Language 超文本置标语言)模式录制 与基于URL(Uniform Re ...
- Sqli-labs less 12
Less-12 本关和less11是类似的,只是在id 的参数的处理上有一定的不同 当输入username:admin" Password: (随便) 报错后的结果为: You have a ...
- Memory Allocation with COBOL
Generally, the use of a table/array (Static Memory) is most common in COBOL modules in an applicatio ...
- matlab学习之降噪平滑算法
平滑降噪测试,代码如下 % 平滑降噪 % FFT变换和小波变换 clc clf clear length_of_sig=128; x=linspace(0,2*pi,length_of_sig); % ...