zoukankan      html  css  js  c++  java
  • linux应用程序开发-进程通信(IPC)

    IPC

    why:

    1.数据传输

    2.资源共享

    目的:

    3.通知事件

    4.进程控制

    发展:

    1.UNIX进程间通信

    2.基于SYStem V

    3.POSIX

    方式分类:

    1.pipe(管道) FIFO(有名管道)

    2.signal

    3.消息队列

    4.共享内存

    5.信号量

    6.套接字(socket)

    管道通信:单向,先进先出

    创建

    pipe:父子之间通讯

    FIFO:任意

    创建:

    int pipe(int filedis[2]);

    管道创建时,产生两个文件描述符:filedis[0]读管道,filedid[1]写管道。

    关闭:

    close(filedis[1,2])

    关闭两个描述符

    管道读写:

    父进程写filedis[1],子进程读filedis[0]

    fork必须再pipe之前创建。

    有名管道:FIFO

    创建

    #include<sys/types.h>

    #include<sys/stat.h>

    int mkfifo(const char*pathname,mode_t mode);

    pathname:FIFO文件名

    mode:属性

    操作

    当打开FIFO时,标志(O_NONBLOCK)

    1.没有使用时:访问无法满足时,进程堵塞

    2.使用:访问无法满足时不阻塞,立刻出错返回,error=ENXIO

    信号通讯:

    信号类型:(30种)

    e:

    SIGINT:CRTL+C

    SIGKILL:

    处理;

    1.忽略

    SIGKILL,SIGSTOP不能忽略

    2.执行用户希望的动作

    3.执行默认动作(大多是忽略)

    signal

    #include<signal.h>

    void(*signal(int signo,void (*fun)(int)))(int)//如何理解??

    Func可能取值:

    1.SIG_LGN:忽略此信号

    2.SIG_DFL:按系统默认方式

    3.信号处理函数名:使用该函数处理

    共享内存:

    被多个进程共享一部分物理内存

    速度快,不需要额外访问函数

    实现:

    1.创建 shmget()

    2.映射到具体进程shmat()

    int shmget(key_t key,int size,int shmflg)

    key:共享内存键值

    0/IPC_PRIVATE  创建新的内存,成功返回共享内存标示符,失败环回-1.

    int shmat(int shmid,char*shmaddr,int flag)

    shmid:共享内存标示符

    flag:决定以什么方式来确定映射地址,通常为0

    成功返回映射地址,失败返回-1.

    脱离:

    int shmdt(char*ahmaddr)

    发送:

    kill:向自身或其他进程发送

    rasie:自身

    #include<sys/types.h>

    #include<signal.h>

    int kill(pid_t,int signo)

    int rasie(int signo)

    pid>0:

    pid==0:同组

    pid<0:发送给其进程组id等于|pid|的进程

    pid==-1:所有进程

    Alarm

    unsigned int alarm(unsigned int seconds);

    经过预定的时间,产生sigalrm信号,如果不捕捉,则终止该进程。

    pause

    使进程调用挂起,直到收到一个信号

    int pause(void)

    只有执行了一个信号处理函数后后,挂起才结束。

    消息队列:链表,有特定格式

    克服消息信息量少,管道无格式

    分类:

    posix 

    系统V:

    持续性 

    内核重启,人工删除

    键值:

    key_t ftok(char*pathname,char proj)

    返回文件对应键值

    打开/创建

    int msgget(key_t,int msgflg)

    返回消息队列描述字

    msgflg:标志位

    IPC_CREAT:创建

    IPC_EXCL:若存在,返回错误

    IPC_NOWAIT:无法满足要求,不阻塞

    创建:

    1.没有于key对应的消息队列,且msgflg包含IPC_CREAT标志位

    2.key参数为IPC_PRIVAT

    发送消息

    int msgsnd(int mysqid,struct msbuf*msgp,int msgsz,int msgflg)

    struct msgbuf

    {

      long mtype; //消息类型

      char mtext[1];//消息数据首地址

    }

    接收消息

    int msgrcv(int msqid,struct msgbuf*msgp,int msgsz,long msgtyp,int msgflg)

    信号量(信号灯)

    保护临街资源,进程互斥,进程同步

    分类

    二值信号灯:只能去0,1

    计数信号灯:可以大于1

    创建/打开

    int semget(key_t key,int nsems,int semflg)

    操作:

    int semop(int semid,struct sembuf *sops,unsigned nsops)

    对信号量进行控制。

    semid:信号集ID;

    sops:是一个操作数组

    nsops:sops所指向的数组元素个数。

  • 相关阅读:
    「十二省联考2019」 春节十二响
    「八省联考2018」 劈配
    斯特林数
    「POJ2505」A multiplication game [博弈论]
    [luogu2048] [bzoj2006] [NOI2010] 超级钢琴 题解
    [HNOI2002]-洛谷2234-营业额统计-Treap
    平衡树Treap模板与原理
    KMP算法讲解
    高斯消元--模板,原理
    第一篇博客!!
  • 原文地址:https://www.cnblogs.com/summer-xwq/p/4162341.html
Copyright © 2011-2022 走看看