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 进程学习的更多相关文章

  1. Linux进程学习(孤儿进程和守护进程)

    孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程如 ...

  2. Linux进程学习 - 孤儿进程和守护进程

    孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程如 ...

  3. linux进程学习笔记

    学习了linux下的进程,觉得应该整理一下,忘得差不多了,顺便回顾一下. 学而时习之,不亦说乎~~ 进程笔记 ,什么是进程? The Single UNIX Specification, Versio ...

  4. Linux 进程学习笔记

    1.什么是程序?什么是进程?它们有什么区别? 定义: 程序:程序(Program)是一个静态的命令集合,程序一般放在磁盘中,然后通过用户的执行来触发.触发后程序会加载到内存中成为一个个体,就是进程. ...

  5. linux 进程学习笔记-进程ID,PID

    PID,进程号 , 范围在2~(??为什么需要这么多),而一个名为idle (或swapper)的进程占据的编号0,init进程占据了编号1. 进程0和进程1 : 系统启动时会从无到有地创建进程0,它 ...

  6. linux进程学习-进程描述符的存储

    当进程被新建时,内核会给进程分配一个8K的空间作为进程的内核堆栈.同时我们知道task_struct结构体也会被创建,但有意思的是,内核不会给task_struct单独分别空间,而是直接将其扔到8k的 ...

  7. linux 进程学习笔记-进程调度

    在分时系统中,系统将CPU时间划分成无数个时间片(quantum)分配给不同的进程,一个时间片只执行一个进程,并且不停地切换,以让用户感觉到各个进程是在“同时运行”,这中间所需要的策略和算法便是进程调 ...

  8. linux 进程学习笔记-进程跟踪

    进程跟踪 long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); Linux用ptrace来进行进 ...

  9. linux 进程学习笔记-进程信号sigal

    信号(或软中断)是在软件层次上对中断的一个模拟,其运行在“用户空间”,一个进程对另外一个或几个进程通过发送信号来实现异步通信.当接收进程接收到信号后,其可以注册一下处理函数来说对这些信号进行处理(也可 ...

随机推荐

  1. FFT模板 生成函数 原根 多项式求逆 多项式开根

    FFT #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> ...

  2. gvim代码补全

    gvim 代码自动提示 插件 插件名:AutoComplPop 下载地址:http://www.vim.org/scripts/script.php?script_id=1879 gvim 代码模板补 ...

  3. mac MyEclipse2017 CI10安装破解心得

    前段时间也不知弄了什么东西把之前的me弄坏了,于是看看新版本的情况,准备安装个新版本,一看出了ci10,安装之. 破解资源请到这里下载 https://download.csdn.net/downlo ...

  4. Django常用内置过滤器

    1.add 此过滤器将首先尝试将两个值强制为整数.如果失败,它会尝试将值一起添加.这将工作在一些数据类型(字符串,列表等)和失败在其他人.如果失败,结果将是一个空字符串. {{ value | add ...

  5. Oracle常用常考集合

    登陆远程服务器 sqlplus scott/tiger@192.168.2.1[:port]/sid [as sysdba] 简单查询 select  table_name from user_tab ...

  6. Tyvj1933绿豆蛙的归宿

    给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点.绿豆蛙从起点出发,走向终点. 到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以 ...

  7. 2017广西邀请赛 Query on A Tree (可持续化字典树)

    Query on A Tree 时间限制: 8 Sec  内存限制: 512 MB提交: 15  解决: 3[提交][状态][讨论版] 题目描述 Monkey A lives on a tree. H ...

  8. 【BZOJ 4570】【SCOI 2016】妖怪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4570 对于每个妖怪的两个值,看成二位平面上的一个点的横纵坐标(x,y). 因为只关心a/b,所以设经 ...

  9. [SDOI2005]反素数ant

    题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6 ...

  10. 【状压dp】Islands and Bridges

    Islands and Bridges Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 11034   Accepted: 2 ...