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
信号(或软中断)是在软件层次上对中断的一个模拟,其运行在“用户空间”,一个进程对另外一个或几个进程通过发送信号来实现异步通信.当接收进程接收到信号后,其可以注册一下处理函数来说对这些信号进行处理(也可 ...
随机推荐
- Dubbo 用户手册学习笔记 —— Dubbo架构
Dubbo的架构 节点角色说明 节点 角色说明 Provider 服务提供方 Consumer 服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的调用次数和调用时间的监 ...
- hdu 1243(LCS变形)
反恐训练营 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- cuda8.0 百度云盘分享
因为深度学习的需要,装了ubuntu16系统,同时也装了cuda,在下载cuda的时候发现教育网下载的速度不忍直视,故换了更快的网下载,结果发现10兆宽带下载速度依然很慢,不过总算还是下载了,故把千辛 ...
- python的str,unicode对象的encode和decode方法(转)
python的str,unicode对象的encode和decode方法(转) python的str,unicode对象的encode和decode方法 python中的str对象其实就是" ...
- python的ipython manage.py shell 引发的 No module named _argparse
环境是:Centos6.6 ,python 2.6 今晚,shell 中输入: # ipython manage.py shell 报错,说找不到命令: 我当时,觉得,我有可能没有安装ipython ...
- Linux修改用户基本信息(不含密码)
如果想修改密码请查看Linux命令之passwd.chpasswd (1).使用usermod修改用户基本信息 Linux命令之usermod (2).进入配置文件修改用户信息 使用vim /etc/ ...
- http://download.eclipse.org/technology/m2e/releases install error
Can you try running Eclipse as Admin and try this again?. Let me know how that goes. what is the upd ...
- 子查询在UPDATE 语句中的应用
在UPDATE语句中可以在更新列表中以及WHERE语句使用子查询.下面演示一个将图书的出版日期全部更新为所有图书中的最新出版日期,SQL语句如下: UPDATE T_Book SET FYearPub ...
- 五种常用的C/C++编译器对64位整型的支持
变量定义 输出方式 gcc(mingw32) g++(mingw32) gcc(linux i386) g++(linux i386) MicrosoftVisual C++ 6.0 long lon ...
- JZYZOJ1386 扑街 状压dp
http://172.20.6.3/Problem_Show.asp?id=1386 有一个W行H列的街道,需要用1*2小砖铺盖,小砖之间互相不能重叠,问有多少种不同的铺法? 数组f的不往后延伸指 ...