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. Oracle11g常用的命令

    cmd H: cd H:\oracle\product\\Db_1\BIN exp jz/jz file=C:/QS-BF20131017.dmp (备份) imp jz/jz file=C:/BF2 ...

  2. Asp.net网页中DataGridView数据导出到Excel

    经过上网找资料,终于找到一种可以直接将GridView中数据导出到Excel文件的方法,归纳方法如下: 1. 注:其中的字符集格式若改为“GB2312”,导出的部分数据可能为乱码: 导出之前需要关闭分 ...

  3. 深入解析当下大热的前后端分离组件django-rest_framework系列四

    查漏补缺系列 解析器 request类 django的request类和rest-framework的request类的源码解析 局部视图 from rest_framework.parsers im ...

  4. Java学习笔记(九)——javabean

    [前面的话] 实际项目在用spring框架结合dubbo框架做一个系统,虽然也负责了一块内容,但是自己的能力还是不足,所以还需要好好学习一下基础知识,然后做一些笔记.自己的自学能力还是显得不够好,每次 ...

  5. AC日记——[POI2008]BLO-Blockade 洛谷 [POI2008]BLO-Blockade

    [POI2008]BLO-Blockade 思路: tarjan: 代码: #include <bits/stdc++.h> using namespace std; #define ma ...

  6. 【转载】Web Service 的工作原理

    http://www.cnblogs.com/Jessy/p/3528341.html Web Service基本概念 Web Service也叫XML Web Service WebService是 ...

  7. #1054 - Unknown column 'category' in 'field list'

    导致这个问题的原因有: 1.确实没有这个字段 2.写错表了,你以为写到想要的表,没想到写到别处去了,当然没有这个字段了,这时候检查一下sql语句是不是选错了表,或者选错了数据库

  8. RecyclerView 和 ListView 使用对比分析

    原文地址:http://blog.coderclock.com/2016/08/08/android/RecyclerView%20%E5%92%8C%20ListView%20%E4%BD%BF%E ...

  9. Java工具类-加密算法

    import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.securit ...

  10. Mybatis 使用Mybatis时实体类属性名和表中的字段名不一致

    开发中,实体类中的属性名和对应的表中的字段名不一定都是完全相同的,这样可能会导致用实体类接收返回的结果时导致查询到的结果无法映射到实体类的属性中,那么该如何解决这种字段名和实体类属性名不相同的冲突呢? ...