精华内容
下载资源
问答
  • 2021-05-08 23:29:12

    Linux作为一种新兴的操作系统,几乎支持所有的Unix下常用的进程间通信方法:管道、消息队列、共享内存、信号量、套接口。

    1、管道

    管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

    2、 消息队列

    消息队列用于运行于同一台机器上的进程间通信,它和管道很相似,是一个在系统内核中用来保存消息的队列,它在系统内核中是以消息链表的形式出现。消息链表中节点的结构用msg声明。

    事实上,它是一种正逐渐被淘汰的通信方式,我们可以用流管道或者套接口的方式来取代它,所以,我们对此方式也不再解释,也建议读者忽略这种方式。

    3 、共享内存

    共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

    共享内存是运行在同一台机器上的进程间通信最快的方式,因为数据不需要在不同的进程间复制。通常由一个进程创建一块共享内存区,其余进程对这块内存区进行 读写。得到共享内存有两种方式:映射/dev/mem设备和内存映像文件。前一种方式不给系统带来额外的开销,但在现实中并不常用,因为它控制存取的将是 实际的物理内存,在Linux系统下,这只有通过限制Linux系统存取的内存才可以做到,这当然不太实际。常用的方式是通过shmXXX函数族来实现利 用共享内存进行存储的。

    4、信号量

    信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是前一节的共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作:

    (1) 测试控制该资源的信号量。

    (2) 若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。

    (3) 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1)。

    (4) 当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正在睡眠等待此信号量,则唤醒此进程。

    维护信号量状态的是Linux内核操作系统而不是用户进程。我们可以从头文件/usr/src/linux/include /linux /sem.h 中看到内核用来维护信号量状态的各个结构的定义。信号量是一个数据集合,用户可以单独使用这一集合的每个元素。要调用的第一个函数是semget,用以获 得一个信号量ID。

    信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

    6、套接口

    套接口(socket)编程是实现Linux系统和其他大多数操作系统中进程间通信的主要方式之一。我们熟知的WWW服务、FTP服务、TELNET服务 等都是基于套接口编程来实现的。除了在异地的计算机进程间以外,套接口同样适用于本地同一台计算机内部的进程间通信。关于套接口的经典教材同样是 Richard Stevens编著的《Unix网络编程:联网的API和套接字》

    线程间通信:

    1.全局变量

    进程中的线程间内存共享,这是比较常用的通信方式和交互方式。

    注:定义全局变量时最好使用volatile来定义,以防编译器对此变量进行优化。

    2.Message消息机制

    常用的Message通信的接口主要有两个:PostMessage和PostThreadMessage,

    PostMessage为线程向主窗口发送消息。而PostThreadMessage是任意两个线程之间的通信接口。

    1)定义消息#define WM_THREAD_SENDMSG=WM_USER+20;

    2)添加消息函数声明afx_msgintOnTSendmsg();

    3)添加消息映射ON_MESSAGE(WM_THREAD_SENDMSG,OnTSM)

    4)添加OnTSM()的实现函数;

    5)在线程函数中添加PostMessage消息Post函数

    3.CEvent对象

    CEvent为MFC中的一个对象,可以通过对CEvent的触发状态进行改变,从而实现线程间的通信和同步。

    1)创建一个CEvent类的对象:CEvent threadStart;它默认处在未通信状态; 2)threadStart.SetEvent();使其处于通信状态;

    3)调用WaitForSingleObject()来监视CEvent对象

    更多相关内容
  • 1. linux下进程间通信的几种主要手段简介: ... 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了...

    1. linux下进程间通信的几种主要手段简介:

    1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

    2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);

    3. 报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

    4. 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

    5. 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

    6. 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

    一般来说,linux下的进程包含以下几个关键要素:

    • 有一段可执行程序;

    • 有专用的系统堆栈空间;

    • 内核中有它的控制块(进程控制块),描述进程所占用的资源,这样,进程才能接受内核的调度;

    • 具有独立的存储空间

    另外附上一个很好的博文——进程间的五种通信方式介绍 - wh_sjc的博客 - CSDN博客 https://blog.csdn.net/wh_sjc/article/details/70283843

    线程间的通信、同步方式与进程间通信方式 - 星仔的“韵” - CSDN博客
    https://blog.csdn.net/liu5320102/article/details/50764645

    线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

    2. Linux系统中的线程间通信方式主要以下几种:

    *  锁机制:包括互斥锁、条件变量、读写锁和自旋锁。

       互斥锁确保同一时间只能有一个线程访问共享资源。当锁被占用时试图对其加锁的线程都进入阻塞状态(释放CPU资源使其由运行状态进入等待状态)。当锁释放时哪个等待线程能获得该锁取决于内核的调度。

      读写锁当以写模式加锁而处于写状态时任何试图加锁的线程(不论是读或写)都阻塞,当以读状态模式加锁而处于读状态时“读”线程不阻塞,“写”线程阻塞。读模式共享,写模式互斥。

       条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

       自旋锁上锁受阻时线程不阻塞而是在循环中轮询查看能否获得该锁,没有线程的切换因而没有切换开销,不过对CPU的霸占会导致CPU资源的浪费。 所以自旋锁适用于并行结构(多个处理器)或者适用于锁被持有时间短而不希望在线程切换产生开销的情况。

    *  信号量机制(Semaphore):包括无名线程信号量和命名线程信号量

    *  信号机制(Signal):类似进程间的信号处理

    linux基础——linux线程间通信及同步机制总结 - 千里之行,始于足下 - CSDN博客 https://blog.csdn.net/a987073381/article/details/52029070

    展开全文
  • Linux系统中的进程间通信方式 进程是一个独立的资源分配单元,不同的进程(通常指的是用户进程)之间的资源是独立的,没有关联,不能在同一个进程中直接访问另一个进程的资源。 进程间通信(IPC)的目的: 数据...

    Linux系统中的进程间通信方式

    进程是一个独立的资源分配单元,不同的进程(通常指的是用户进程)之间的资源是独立的,没有关联,不能在同一个进程中直接访问另一个进程的资源。

    进程间通信(IPC)的目的

    • 数据传输:一个进程需要将它的数据发送给另一个进程。
    • 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时需要通知父进程)。
    • 资源共享:多个进程之间共享同样的资源,需要内核提供互斥和同步机制。
    • 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变

    同一主机上的进程通信方式

    •    UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal)
    •    System V进程通信方式:包括信号量(Semaphore), 消息队列(Message Queue), 和共享内存(Shared Memory)

    网络主机间的进程通信方式

    •    RPC: Remote Procedure Call 远程过程调用
    •    Socket: 当前最流行的网络通信方式, 基于TCP/IP协议的通信方式.

    各自的特点如下:

    • 无名管道/匿名管道(PIPE):无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系(父子进程)的进程间使用。另外无名管道传送的是无格式的字节流,并且管道缓冲区的大小是有限的(管道缓冲区存在于内存中,在管道创建时,为缓冲区分配一个页面大小)。
    • 有名管道 (FIFO): 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
    • 高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们称为高级管道方式。

    • 信号(Signal): 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
    • 信号量(Semaphore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
    • 消息队列(Message Queue):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
    • 共享内存(Shared Memory ):共享内存就是映射一段能被其他进程所访问的内存(内存映射),这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
    • 套接字(Socket): 套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同主机间的进程通信。

    Linux系统中的线程间通信方式主要以下几种:

    • 锁机制:包括互斥锁、条件变量、读写锁、自旋锁

            互斥锁提供了以排他方式防止数据结构被并发修改的方法。互斥锁确保同一时间只能有一个线程访问共享资源。当锁被占用时试图对其加锁的线程都进入阻塞状态(释放CPU资源使其由运行状态进入等待状态)。当锁释放时哪个等待线程能获得该锁取决于内核的调度。

            读写锁允许多个线程同时读共享数据,而对写操作是互斥的。当以写模式加锁而处于写状态时任何试图加锁的线程(不论是读或写)都阻塞,当以读状态模式加锁而处于读状态时“读”线程不阻塞,“写”线程阻塞。读模式共享,写模式互斥。

            条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

            自旋锁上锁受阻时线程不阻塞而是在循环中轮询查看能否获得该锁,没有线程的切换因而没有切换开销,不过对CPU的霸占会导致CPU资源的浪费。 所以自旋锁适用于并行结构(多个处理器)或者适用于锁被持有时间短而不希望在线程切换产生开销的情况。

    • 信号量机制(Semaphore):包括无名线程信号量和命名线程信号量
    • 信号机制(Signal):类似进程间的信号处理

    线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

    展开全文
  • Linux的进程/线程通信方式总结

    千次阅读 2021-05-08 23:28:58
    Linux系统中的进程通信方式主要以下几种:同一主机上的进程通信方式* UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal)* System V进程通信方式:包括信号量(Semaphore), 消息队列(Message Queue)...

    Linux系统中的进程通信方式主要以下几种:

    同一主机上的进程通信方式

    * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal)

    * System V进程通信方式:包括信号量(Semaphore), 消息队列(Message Queue),

    和共享内存(Shared Memory)

    网络主机间的进程通信方式

    * RPC: Remote Procedure Call 远程过程调用

    * Socket: 当前最流行的网络通信方式, 基于TCP/IP协议的通信方式.

    各自的特点:

    管道:它传递数据是单向性的,只能从一方流向另一方,也就是一种半双工的通信方式;只用于有亲缘关系的进程间的通信,亲缘关系也就是父子进程或兄弟进程;没有名字并且大小受限,传输的是无格式的流,所以两进程通信时必须约定好数据通信的格式。管道它就像一个特殊的文件,但这个文件之存在于内存中,在创建管道时,系统为管道分配了一个页面作为数据缓冲区,进程对这个数据缓冲区进行读写,以此来完成通信。其中一个进程只能读一个只能写,所以叫半双工通信,为什么一个只能读一个只能写呢?因为写进程是在缓冲区的末尾写入,读进程是在缓冲区的头部读取,他们各自

    的数据结构不同,所以功能不同。

    有名管道:看见这个名字就能知道个大概了,它于管道的不同的是它有名字了。这就不同与管道只能在具有亲缘关系的进程间通信了。它提供了一个路径名与之关联,有了自己的传输格式。有名管道和管道的不同之处还有一点是,有名管道是个设备文件,存储在文件系统中,没有亲缘关系的进程也可以访问,但是它要按照先进先出的原则读取数据。同样也是单双工的。

    消息队列:是存放在内核中的消息链表,每个消息队列由消息队列标识符标识,于管道不同的是,消息队列存放在内核中,只有在内核重启时才能删除一个消息队列,内核重启也就是系统重启,同样消息队列的大小也是受限制的。

    信号量:也可以说是一个计数器,常用来处理进程或线程同步的问题,特别是对临界资源的访问同步问题。临界资源:为某一时刻只能由一个进程或线程操作的资源,当信号量的值大于或等于0时,表示可以供并发进程访问的临界资源数,当小于0时,表示正在等待使用临界资源的进程数。更重要的是,信号量的值仅能由PV操作来改变。

    共享内存:就是分配一块能被其他进程访问的内存。共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。首先说下在使用共享内存区前,必须通过系统函数将其附加到进程的地址空间或说为映射到进程空间。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到

    进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互

    斥锁和信号量都可以。采用共享内存通信的一个显而易

    见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而

    共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就

    解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存

    中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。

    信号:信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源。信号分为可靠信号和不可靠信号,实时信号和非实时信号。进程有三种方式响应信号1.忽略信号2.捕捉信号3.执行缺省操作。

    套接字:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同主机间的进程通信。这一块在网络编程那一块讲的

    很多,在此就不在说拉。

    Linux系统中的线程通信方式主要以下几种:

    * 锁机制:包括互斥锁、条件变量、读写锁

    互斥锁提供了以排他方式防止数据结构被并发修改的方法。

    使用条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

    读写锁允许多个线程同时读共享数据,而对写操作是互斥的。

    * 信号量机制(Semaphore):包括无名线程信号量和命名线程信号量

    * 信号机制(Signal):类似进程间的信号处理

    线程间的通信目的主要是用于线程同步。所以线程没有像进程通信中的用于数据交换的通信机制。

    展开全文
  • linux线程间通信示例

    2021-05-14 01:27:50
    缺点是如果unlock和pthread_cond_signal之间,有个低优先级的线程正在mutex上等待的话,那么这个低优先级的线程就会抢占高优先级的线程 (调用pthread_cond_wait的线程)linux线程通信,而这在上面的放中间的模式...
  • Linux线程间通信方式总结

    千次阅读 2017-12-05 16:06:33
    Linux系统中的线程间通信方式主要以下几种: * 锁机制:包括互斥锁、条件变量、读写锁和自旋锁。  互斥锁确保同一时间只能有一个线程访问共享资源。当锁被占用时试图对其加锁的线程都进入阻塞状态(释放CPU资源使...
  • Linux下进程间通信方式线程间通讯

    千次阅读 2019-11-10 22:51:50
    线程和进程的基本问题 https://www.cnblogs.com/wuyepeng/p/9859341.html 线程和进程的比较 1.进程是资源分配的基本单位。 2.线程是独立调度的基本单位。 3.在同一个进程中,线程的切换不会引起进程的切换。在...
  • linux线程间通信中的信号量

    千次阅读 2017-10-30 23:07:04
    什么是信号量线程的信号量与进程间通信中使用的信号量的概念是一样,它是一种特殊的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作。如果一个程序中有多个线程试图改变一个信号量的值,系统将保证所有...
  • 多进程和多线程是系统执行多任务机制的重要手段,多任务同时进行自然少不了相互之间的通信工作。下面先将线程间通信方式总结一下,便于大家对比学习。
  • 无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程使用.进程的亲缘关系一般指的是父子关系。无明管道一般用于两个不同进程之间的通信。当一个进程创建了一个管道,并调用fork创建自己...
  • 一、进程间通信(IPC,Inter-Process Communication)是指在不同进程间传播或交换信息 1. 无名管道 特点 半双工(数据流向仅有一个方向),具有固定的读端和写端 只能用于父进程或兄弟线程之间通信(具有血缘关系的...
  • linux基础——linux线程间通信及同步机制总结

    万次阅读 多人点赞 2016-07-25 22:45:16
    线程间通信有两种情况: 1、一个进程中的线程与另外一个进程中的线程通信,由于两个线程只能访问自己所属进程的地址空间和资源,故等同于进程间的通信。 2、同一个进程中的两个线程进行通信。本文说的就是第二种...
  • 线程间同步和通信之消息队列(动态),通过按键LED的组合学习消息队列的使用
  • [经典]linux线程编程-线程间通信(1).
  • Linux下c开发之——线程间通信

    千次阅读 2017-07-11 23:25:27
    Linux下c开发之——线程间通信 <span class="link_postdate">2016-02-18 17:50 <span class="li
  • linux进程间通信方式及比较

    千次阅读 2014-12-06 17:00:49
    进程通信方式:  1.管道(pipe)及有名管道(named pipe):  管道可用于具有亲缘关系进程的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程的通信。  2.信号(signal): ...
  • 线程间通信及同步方法介绍

    千次阅读 2021-05-23 11:01:04
    线程间通信及同步方法介绍:一、线程间的通信方式1、使用全局变量主要由于多个线程可能更改全局变量,因此全局变量最好声明为volatile。2、使用消息实现通信在Windows程序设计中,每一个线程都可以拥有自己的消息...
  • 主要介绍了Linux消息队列实现进程间通信实例详解的相关资料,需要的朋友可以参考下
  • Linux下基于socket多线程并发通信的实现.pdf
  • Linux下,多线程通信

    2012-08-11 14:11:27
    基于linux下的多线程网络通信,将pthread与socket完美的结合了起来,采用AF_INET因特网协议,实现linux下网络通信。这可是我辛苦的几天下来才最终完成的,欢迎下载。
  • 进程间通信和线程间通信

    千次阅读 2020-08-18 20:26:22
    线程间通信 进程和线程的区别 程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体。而进程则不同,它是程序在某个数据集上的执行。进程是一个动态的实体,它有自己的生命周期。它因...
  • 通信方式有以下几种: 锁机制:包括互斥锁、条件变量、读写锁 互斥锁提供了以排他方式防止数据结构被并发修改的方法。 读写锁允许多个线程同时读共享数据,而对写操作是互斥的。 条件变量可以以原子的方式阻塞...
  • linux线程间同步方式(inter-thread-synchronization)汇总 包含的同步方式 互斥量 条件变量 读写锁 自旋锁 barrier(这个不知道怎么翻译) #扩展 我的另一个仓库有关于linux进程间通信方式汇总,,供参考,欢迎讨论...
  • 消息队列在Linux线程或进程间通信中的应用.pdf
  • Linux 线程间同步机制

    2018-08-09 20:18:40
    互斥以排他方式防止共享数据被并发修改。互斥锁是一个二元变量,其状态为开锁(允许0)和上锁(禁止1),将某个共享资源与某个特定互斥锁绑定后,对该共享资源的访问如下操作: (1)在访问该资源前,首先申请该互斥...
  • 11_C++多线程及线程间通信

    千次阅读 2019-08-08 18:06:56
    参考: https://m.imooc.com/article/289630 C++11 标准库新引入的线程库 ...(一)多线程编程 #include <iostream> #include <thread> #include <mutex> #include <condi...
  • Linux系统中的线程间通信方式主要以下几种: *锁机制:包括互斥锁、条件变量、读写锁和自旋锁。 互斥锁确保同一时间只能有一个线程访问共享资源。当锁被占用时试图对其加锁的线程都进入阻塞状态(释放CPU资源使其由...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 83,491
精华内容 33,396
关键字:

linux线程间通信的方式