精华内容
下载资源
问答
  • linux进程间通信总结

    2019-02-21 11:28:23
    linux进程间通信总结 无名管道 只支持单向数据流(0读1写);只能用于具有亲缘关系的进程之间;没有名字;管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);管道所传送的是无...

    linux进程间通信总结

    无名管道

    只支持单向数据流(0读1写);只能用于具有亲缘关系的进程之间;没有名字;管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式。多应用于shell,每个进程关闭自己不需要的一个连接,#include <unistd.h> int pipe(int fd[2])

    有名管道

    FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。
    int mkfifo(const char * pathname, mode_t mode)

    信号

    异步通信方式,是在软件层次对中断机制的一种模拟。信号分为可靠信号(那些从UNIX系统继承过来的信号都是非可靠信号, 表现在信号不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值小于SIGRTMIN的都是非可靠信号)和不可靠信号(Linux改进了信号机制, 增加了32种新的信号, 这些信号都是可靠信号, 表现在信号支持排队, 不会丢失, 发多少次, 就可以收到多少次. 信号值位于 [SIGRTMIN, SIGRTMAX] 区间的都是可靠信号)。
    Linux系统中常用信号:
    (1)SIGHUP:用户从终端注销,所有已启动进程都将收到该进程。系统缺省状态下对该信号的处理是终止进程。
    (2)SIGINT:程序终止信号。程序运行过程中,按Ctrl+C键将产生该信号。
    (3)SIGQUIT:程序退出信号。程序运行过程中,按Ctrl+\键将产生该信号。
    (4)SIGBUS和SIGSEGV:进程访问非法地址。
    (5)SIGFPE:运算中出现致命错误,如除零操作、数据溢出等。
    (6)SIGKILL:用户终止进程执行信号。shell下执行kill -9发送该信号。
    (7)SIGTERM:结束进程信号。shell下执行kill 进程pid发送该信号。
    (8)SIGALRM:定时器信号。
    (9)SIGCLD:子进程退出信号。如果其父进程没有忽略该信号也没有处理该信号,则子进程退出后将形成僵尸进程。
    信号生命周期和处理流程
    (1)信号被某个进程产生,并设置此信号传递的对象(一般为对应进程的pid),然后传递给操作系统;
    (2)操作系统根据接收进程的设置(是否阻塞)而选择性的发送给接收者,如果接收者阻塞该信号(且该信号是可以阻塞的),操作系统将暂时保留该信号,而不传递,直到该进程解除了对此信号的阻塞(如果对应进程已经退出,则丢弃此信号),如果对应进程没有阻塞,操作系统将传递此信号。
    (3)目的进程接收到此信号后,将根据当前进程对此信号设置的预处理方式,暂时终止当前代码的执行,保护上下文(主要包括临时寄存器数据,当前程序位置以及当前CPU的状态)、转而执行中断服务程序,执行完成后再恢复到中断的位置。当然,对于抢占式内核,在中断返回时还将引发新的调度。

    消息队列

    与命名管道相比,消息队列的优势在于,1、消息队列也可以独立于发送和接收进程而存在,从而消除了在同步命名管道的打开和关闭时可能产生的困难。2、同时通过发送消息还可以避免命名管道的同步和阻塞问题,不需要由进程自己来提供同步方法。3、接收程序可以通过消息类型有选择地接收数据,而不是像命名管道中那样,只能默认地接收。

    信号量

    信号量与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制。相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志。除了用于访问控制外,还可用于进程同步。

    共享内存

    速度最快,效率最高的进程间通信方式,进程之间直接访问内存,而不是通过传送数据。但是使用共享内存需要自己提供同步机制。
    int shmget(key_t key, size_t size, int shmflg);创建共享内存,
    void *shmat(int shm_id, const void *shm_addr, int shmflg);启动对共享内存的访问,第一次创建完共享内存时,它还不能被任何进程访问,shmat函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。,shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。shm_flg是一组标志位,通常为0。
    int shmdt(const void *shmaddr);将共享内存从当前进程中分离,将共享内存分离并不是删除它,只是使该共享内存对当前进程不再可用。
    int shmctl(int shm_id, int command, struct shmid_ds *buf);控制共享内存, IPC_RMID:删除共享内存段

    Unix域套接字

    虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。UNIX域套接字与TCP套接字相比较,在同一台传输主机的速度前者是后者的两倍。这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。UNIX Domain Socket也提供面向流和面向数据包两种API接口,类似于TCP和UDP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。值得注意的是,Unix域协议表示协议地址的是路径名,而不是Internet域的IP地址和端口号。

    展开全文
  • Linux进程间通信总结

    2016-07-17 22:41:00
    Linux进程间通信总结 1. 管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: (1)管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; (2)只能用于父子进程或者兄弟...

    Linux进程间通信总结

    1. 管道

    管道是Linux支持的最初Unix IPC形式之一,具有以下特点:

    (1)管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;

    (2)只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);

    (3)单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。

    (4)数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

     

    管道的创建

     

        #include <unistd.h>

        int pipe(int fd[2])

    返回的fd[0]用于读,fd[1]用于写。因此,一个进程在由pipe()创建管道后,一般再fork一个子进程,然后通过管道实现父子进程间的通信(因此也不难推出,只要两个进程中存在亲缘关系,这里的亲缘关系指的是具有共同的祖先,都可以采用管道方式来进行通信)。

     

    管道的应用:

    * shell:

    管道可用于输入输出重定向,它将一个命令的输出直接定向到另一个命令的输入。比如,当在某个shell程序键入who│wc -l后,相应shell程序将创建who以及wc两个进程和这两个进程间的管道

    * 用于具有亲缘关系的进程间通信

     

    管道的局限:

    * 只支持单向数据流;

    * 只能用于具有亲缘关系的进程之间;

    * 没有名字;

    * 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);

    * 管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式。

     

    2. 有名管道

    FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。

     

    有名管道创建:

     

        int mkfifo(const char * pathname, mode_t mode)

       

    3. 信号

    信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源,最常用发送信号的系统函数是kill, raise,alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。

     

    (1)信号的种类

    可靠信号与不可靠信号, 实时信号与非实时信号

    可靠信号就是实时信号, 那些从UNIX系统继承过来的信号都是非可靠信号, 表现在信号

    不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值小于SIGRTMIN的都是非可靠信号.

    非可靠信号就是非实时信号, 后来, Linux改进了信号机制, 增加了32种新的信号, 这些信

    号都是可靠信号, 表现在信号支持排队, 不会丢失, 发多少次, 就可以收到多少次. 信号值

    位于 [SIGRTMIN, SIGRTMAX] 区间的都是可靠信号.

    (2)信号的安装

    早期的Linux使用系统调用 signal 来安装信号

    #include <signal.h>

    void (*signal(int signum, void (*handler))(int)))(int); 

    该函数有两个参数, signum指定要安装的信号, handler指定信号的处理函数.

    该函数的返回值是一个函数指针, 指向上次安装的handler

     

    经典安装方式:

    if (signal(SIGINT, SIG_IGN) != SIG_IGN) {

        signal(SIGINT, sig_handler);

    }

    先获得上次的handler, 如果不是忽略信号, 就安装此信号的handler

     

    由于信号被交付后, 系统自动的重置handler为默认动作, 为了使信号在handler处理期间, 仍能对后继信号做出反应, 往往在handler的第一条语句再次调用 signal

    sig_handler(ing signum)

    {

        /* 重新安装信号 */

        signal(signum, sig_handler);

        ......

    }

    我们知道在程序的任意执行点上, 信号随时可能发生, 如果信号在sig_handler重新安装

    信号之前产生, 这次信号就会执行默认动作, 而不是sig_handler. 这种问题是不可预料的.

     

    使用库函数 sigaction  来安装信号

    为了克服非可靠信号并同一SVR4和BSD之间的差异, 产生了 POSIX 信号安装方式, 使用sigaction安装信号的动作后, 该动作就一直保持, 直到另一次调用 sigaction建立另一个动作为止. 这就克服了古老的 signal 调用存在的问题

     

    #include <signal.h> 
    int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact));

     

    /* 设置SIGINT */

    action.sa_handler = sig_handler;

    sigemptyset(&action.sa_mask);

    sigaddset(&action.sa_mask, SIGTERM);

    action.sa_flags = 0;

     

    /* 获取上次的handler, 如果不是忽略动作, 则安装信号 */

    sigaction(SIGINT, NULL, &old_action);

    if (old_action.sa_handler != SIG_IGN) {

        sigaction(SIGINT, &action, NULL);

    }

     

    基于 sigaction 实现的库函数: signal

    sigaction 自然强大, 但安装信号很繁琐, 目前linux中的signal()是通过sigation()函数实现的,因此,即使通过signal()安装的信号,在信号处理函数的结尾也不必再调用一次信号安装函数。

     

    3)如何屏蔽信号

    所谓屏蔽, 并不是禁止递送信号, 而是暂时阻塞信号的递送, 

    解除屏蔽后, 信号将被递送, 不会丢失. 相关API为

    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 sigsuspend(const sigset_t *mask);

    int sigpending(sigset_t *set);

    -----------------------------------------------------------------

    int  sigprocmask(int  how,  const  sigset_t *set, sigset_t *oldset));

    sigprocmask()函数能够根据参数how来实现对信号集的操作,操作主要有三种:

    * SIG_BLOCK  在进程当前阻塞信号集中添加set指向信号集中的信号

    * SIG_UNBLOCK   如果进程阻塞信号集中包含set指向信号集中的信号,则解除

       对该信号的阻塞

    * SIG_SETMASK    更新进程阻塞信号集为set指向的信号集

    屏蔽整个进程的信号:

    4)信号的生命周期

    从信号发送到信号处理函数的执行完毕

    对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,

    可以分为三个重要的阶段,这三个阶段由四个重要事件来刻画:

    信号诞生;信号在进程中注册完毕;信号在进程中的注销完毕;信号处理函数执行完毕。

     

    下面阐述四个事件的实际意义:

    信号"诞生"。信号的诞生指的是触发信号的事件发生(如检测到硬件异常、定时器超时以及调用信号发送函kill()或sigqueue()等)。

    信号在目标进程中"注册";

    进程的task_struct结构中有关于本进程中未决信号的数据成员:

    struct sigpending pending:

    struct sigpending{

          struct sigqueue *head, **tail;

          sigset_t signal;

    };

     

    第三个成员是进程中所有未决信号集,第一、第二个成员分别指向一个

    sigqueue类型的结构链(称之为"未决信号链表")的首尾,链表中

    的每个sigqueue结构刻画一个特定信号所携带的信息,并指向下一个

    sigqueue结构:

    struct sigqueue{

          struct sigqueue *next;

          siginfo_t info;

    }

    信号的注册

    信号在进程中注册指的就是信号值加入到进程的未决信号集中

    (sigpending结构的第二个成员sigset_t signal),

    并且加入未决信号链表的末尾。 只要信号在进程的未决信号集中,

    表明进程已经知道这些信号的存在,但还没来得及处理,或者该信号被进程阻塞。

    当一个实时信号发送给一个进程时,不管该信号是否已经在进程中注册,

    都会被再注册一次,因此,信号不会丢失,因此,实时信号又叫做"可靠信号"。

    这意味着同一个实时信号可以在同一个进程的未决信号链表中添加多次. 

    当一个非实时信号发送给一个进程时,如果该信号已经在进程中注册,

    则该信号将被丢弃,造成信号丢失。因此,非实时信号又叫做"不可靠信号"。

    这意味着同一个非实时信号在进程的未决信号链表中,至多占有一个sigqueue结构.

    一个非实时信号诞生后,

    (1)、如果发现相同的信号已经在目标结构中注册,则不再注册,对于进程来说,

    相当于不知道本次信号发生,信号丢失.

    (2)、如果进程的未决信号中没有相同信号,则在进程中注册自己。

     

    信号的注销。

    在进程执行过程中,会检测是否有信号等待处理

    (每次从系统空间返回到用户空间时都做这样的检查)。如果存在未决

    信号等待处理且该信号没有被进程阻塞,则在运行相应的信号处理函数前,

    进程会把信号在未决信号链中占有的结构卸掉。是否将信号从进程未决信号集

    中删除对于实时与非实时信号是不同的。对于非实时信号来说,由于在未决信

    号信息链中最多只占用一个sigqueue结构,因此该结构被释放后,应该把信

    号在进程未决信号集中删除(信号注销完毕);而对于实时信号来说,可能在

    未决信号信息链中占用多个sigqueue结构,因此应该针对占用sigqueue结构

    的数目区别对待:如果只占用一个sigqueue结构(进程只收到该信号一次),

    则应该把信号在进程的未决信号集中删除(信号注销完毕)。否则,不应该在进程

    的未决信号集中删除该信号(信号注销完毕)。 

    进程在执行信号相应处理函数之前,首先要把信号在进程中注销。

     

    信号生命终止。

    进程注销信号后,立即执行相应的信号处理函数,执行完毕后,

    信号的本次发送对进程的影响彻底结束。

     

    4. system V 提供的进程间通信的三种方式

    (1)消息队列

     

    与命名管道相比,消息队列的优势在于,1、消息队列也可以独立于发送和接收进程而存在,从而消除了在同步命名管道的打开和关闭时可能产生的困难。2、同时通过发送消息还可以避免命名管道的同步和阻塞问题,不需要由进程自己来提供同步方法。3、接收程序可以通过消息类型有选择地接收数据,而不是像命名管道中那样,只能默认地接收。

     

    (2)信号量

     

    信号量与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制。相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志。除了用于访问控制外,还可用于进程同步。信号量有以下两种类型:

    二值信号量:最简单的信号量形式,信号灯的值只能取0或1,类似于互斥锁。

    计算信号量:信号量的值可以取任意非负值(当然受内核本身的约束)。

     

    信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:

    P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行

    V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.

     

    (3)共享内存

     

    速度最快,效率最高的进程间通信方式,进程之间直接访问内存,而不是通过传送数据。但是使用共享内存需要自己提供同步机制。

     

    5. 套接字(unix域协议)

    socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。UNIX域套接字与TCP套接字相比较,在同一台传输主机的速度前者是后者的两倍。这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。UNIX Domain Socket也提供面向流和面向数据包两种API接口,类似于TCP和UDP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。

     值得注意的是,Unix域协议表示协议地址的是路径名,而不是Internet域的IP地址和端口号。

     

        #define UNIX_PATH_MAX    108

        struct sockaddr_un 

        { 

        sa_family_t sun_family;               /* AF_UNIX */

        char        sun_path[UNIX_PATH_MAX];  /* pathname */

        };

       

    socketpair 函数:创建一个全双工的流管道

       

        int socketpair(int domain, int type, int protocol, int sv[2]);

     

    使用unix域协议的例子

    * libevent网络库对信号的封装:libevent实现了对于socket网络套接口,定时器事件,信号事件的统一监听, 即统一事件源。简单地说,就是把信号也转换成IO事件,集成到Libevent中。网络套接口实际为文件描述符fd,可以在epoll中直接监听,定时器事件可以设置epoll的超时时间进行监听,信号的产生是随机的,libevent网络库是如何进行处理使得能用epoll来实现信号的监听呢?

     

    假如用户要监听SIGINT这个信号,那么在实现的内部就对SIGINT这个信号设置捕抓函数。此外,在实现的内部还要建立一条管道(pipe),并把这个管道加入到多路IO复用函数中。当SIGINT这个信号发生后,捕抓函数将会被调用。而这个捕抓函数的工作就是往管道写入一个字符(这个字符往往等于所捕抓到信号的信号值)。此时,这个管道就变成是可读的了,多路IO复用函数能检测到这个管道变成可读的了。换句话说就是多路IO复用函数检测到这个SIGINT信号发生了,这也就完成了对信号的监听工作。

     

    1. 创建一个管道(Libevent实际上使用的是socketpair)
    2. 为这个socketpair的一个读端创建一个event,并将之加入到多路IO复用函数的监听之中
    3. 设置信号捕抓函数
    4. 有信号发生,就往socketpair写入一个字节

     

    转载于:https://www.cnblogs.com/yangang92/p/5679641.html

    展开全文
  • linux 进程间通信总结

    2019-09-14 03:53:23
    linux 进程通信的一点简单总结,主要包括 管道通信,还有 system v, posix 标准的 消息队列,信号量,共享内存方式。 基于管道的通信主要包括有名管道,和无名管道,所谓的有名管道,就是创建的时候会带有具体的...

    对linux 进程通信的一点简单总结,主要包括 管道通信,还有 system v, posix 标准的 消息队列,信号量,共享内存方式。

    基于管道的通信主要包括有名管道,和无名管道,所谓的有名管道,就是创建的时候会带有具体的标识,以便于确认对谁操作,而无名管道是创建没有名字的管道,在于用的时候是否需要去带有标识的操作

    消息队列和信号量,共享内存都分为 system v 和 POSIX 两种标准,System V 起源较早,用的更为广泛,但是操作上复杂了一些,同时与 linux 系统本身的文件规则不一样,一些函数自然无法使用,POSIX 正是基于这些来得新定义,使用一些标准的 IO 接口也能使用。

    消息队列更偏向于消息通信,本身在处理一些命令通知这样的功能时较为合适,而共享内存因为是直接映射内存,所以相对在进程间传输大量数据时具有较好的应用场合。

    信号量主要用于同步操作,一方执行需要,另一方的结果,或者防止竞争同一空间,而产生的功能。其中 POSIX 标准的无名信号量使用较为简单,多数也都是使用这种。

    转载于:https://my.oschina.net/u/145591/blog/2983404

    展开全文
  • Linux 进程间通信总结

    2016-10-23 23:40:56
    Linux 进程间通信 通信目的: ² 数据传输  一个进程需要将它的数据发送给另一个进程 ² 资源共享  多个进程之间共享同样的资源 ² 通知事件  一个进程需要向另一个或一组进程发送消息,通知它们发生了某种...

    Linux 进程间通信

    通信目的:

    ²  数据传输

        一个进程需要将它的数据发送给另一个进程

    ²  资源共享

        多个进程之间共享同样的资源

    ²  通知事件

        一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件

    ²  4.进程控制

        有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变

     

    进程间通信方式包括:

    1、  无名管道(pipe)和有名管道(FIFO)

    管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,还允许无亲缘关系进程间的通信。

    2、  信号(signal)

    用于通知接受进程有某种事件发生,除了用于进程间,也可以发送信号给进程本身。

    信号是对终端机制的一种模拟,是一种异步通信方式。

    信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以用它来通知用户空间发生了哪些系统事件,可以在任何时候发给一个进程,而无需知道该进程的状态。

    如果该进程当前并未处于执行状态,则该信号就有内核保存起来,直到该进程恢复执行再传递给他;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才传递给进程。

    3、  消息队列

    消息队列是消息的链接表。消息队列克服了信号承载信息量少,管道只能承载无格式字节流,以及缓冲区大小受限等缺点

    4、  共享内存

    最有用的进程间的通信方式。同一块物理内存被映射到进程A,B各自的进程地址空间,A可以及时看到B对共享内存空间中数据的更新。

    效率高,进城可以直接读写内存,不需要任何数据复制。

    5、  信号量

    主要作为进程间,以及同一进程不同线程之间的同步手段。信号量是用来解决进程之间的同步与互斥问题的一种进程之间的通信机制,包括一个称为信号量的变量和在该信号量下等待资源的进程等待队列,以及对信号量进行的两个原子操作(PV操作)

    信号量对应于某一种资源,取一个非负的整形值。信号量的值是指当前可用的资源数量。

    6、  套接字(socket)

    可用于不同机器之间的进程间通信。

    展开全文
  • 转自:...tid=4077304 1、linux进程间通讯 继承unix进程间通讯:管道 信号 AT&T :system V IPC 通讯进程只能在单个计算机 :信号量消息队列 共享内存 BSD:形成了基于socket的进程间通讯...
  • Linux进程间通信的方法一、管道通信管道的特点1.标准流管道2.无名管道3.命名管道FIFO二、system V的三种方法1.共享内存1.使用ftok获取共享内存2.使用shmget获取共享内存3.使用mmap获取共享内存4.hugepage的设定方法2...
  • Linux系统中的进程间通信方式主要以下几种: 同一主机上的进程通信方式  * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal)  * System V进程通信方式:包括信号量(Semaphore), 消息...
  • 管道可用于具有亲缘关系的进程间通信,而name_pipe克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间通信; 有名管道也是半双工的通信方式。 消息队列
  • 进程间通信(IPC)介绍进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。 IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 ...
  • linux 进程通信的一点简单总结,主要包括 管道通信,还有 system v, posix 标准的 消息队列,信号量,共享内存方式。 基于管道的通信主要包括有名管道,和无名管道,所谓的有名管道,就是创建的时候会带有具体的...
  • linux ipc 进程间通信总结

    千次阅读 2018-04-14 16:17:33
    进程间通信 linux 系统中有很多进程,免不了进程间进行通信,即IPC通信,linux 中有6种方式 信号、无名管道(pipe)和有名管道(FIFO)、共享内存、信号量、消息队列、套接字(socket) socket 已经在前面研究tcp/udp的...
  • linux进程间通信

    2017-09-23 20:11:46
    Linux进程间通信总结 1. 管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: (1)管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; (2)只能用于父子进程或者兄弟...
  • linux进程间通信的几种机制的比较及适用场合 1.# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。# 有名管道 (named pipe...
  • 进程间通信 进程间通信:两个进程之间的数据交互 因为进程之间具有独立性,每个进程都有自己的虚拟地址空间,访问的都是自己的虚拟地址空间,因此进程间是无法直接通信的,因此需要操作系统提供中间媒介进行通信. 管道...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 752
精华内容 300
热门标签
关键字:

linux进程间通信总结

linux 订阅