管道通信

C语言学习笔记-进程间通信

丶灬走出姿态 提交于 2019-12-02 20:17:17
一.文件描述符表 # 数据流 0 键盘 1 屏幕 2 屏幕 描述符表的第一列是文件描述符号,另一列是它们对应的数据流,描述符表前三项恒古不变,0号标准输入,1号标准输出,2号标准错误输出,其他项要么为空,要么为链接进程打开的数据流。 怎样返回描述符 FILE * my_file = fopen("xxxx.txt", "r"); int p = fileno(my_file); 复制数据流 dup2(4,3); 将4号描述符的数据流连接到3号描述符 waitpid()函数在sys/wait.h头文件中,作用是等子进程结束后在继续运行父进程 waitpid(进程的pid, 这个变量用来保存进程信息(int指针变量),选项(一般设置为0,设置为0表示等待进程结束)) 在第二个参数中会保存一个值,它会记录进程完成情况,可以用WEXITSTATUS()来查看。 二.c语言中的错误处理代码 每次系统调用时都需要写错误处理代码,即出现错误停止程序,并报错。 exit()函数在stdlib.h头文件中,它可以让进程退出并设置退出状态值 错误处理函数的例子: void error (char * msg) { fprintf(stderr, "%s : %s\n", msg, strerror(errno)); exit(1); } 调用方法 pid_t pid = fork(); if(pid

进程通信之管道

大憨熊 提交于 2019-12-02 19:05:49
进程间的几种通信方式:管道(pipe)、有名管道(named pipe)、信号量(semophore)、消息队列(massage queue)、信号(signal)、共享内存(shared memory)、套接字(socket)。 1.管道的概念 管道是一种两个进程间进行单向通信的机制。因为管道传输数据的单向性,管道又称之为半双工管道。所以管道有一些局限性。    ·数据只能由一个进程流向另一个进程(其中一个写管道,另一个读管道);如果要进行全双工通信,那就要建立两个管道。   ·管道只能用于父子进程或者兄弟进程间的通信,即管道只可用于具有亲缘关系的进程间通信,无亲缘关系的进程用不了管道。 除了以上的局限性,管道还有一些不足,如管道没有名字,管道的缓冲区大小是受限制的,管道所传输的是无格式的字节流。这就要求管道的输入方和输出方事先约定好数据的格式。 对于管道两端的进程来说,管道就是一个特殊的文件,这个文件只存在于内存中。在创建管道时,系统为管道分配一个页面作为数据缓冲区,进行管道通信的两个进程通过读写这个缓冲区来进行通信。 通过管道通信的两个进程,一个进程向管道写数据,一个从管道的另一端读数据。写入的数据每次都添加在管道缓冲区的末尾,读数据的时候都是从缓冲区的头部读出数据。 2.管道的创建与读写 (1)管道创建 Linux下创建管道可以通过函数pipe来完成。该函数调用成功返回0

Linux进程间通信 --- IPC机制(转)

余生颓废 提交于 2019-12-02 12:27:58
在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方法。在linux下有多种进程间通信的方法:半双工管道、命名管道、消息队列、信号、信号量、共享内存、内存映射文件,套接字等等。使用这些机制可以为linux下的网络服务器开发提供灵活而又坚固的框架。 1. 管道 (PIPE) 管道实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。 管道的特点: 1、管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 2、只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。比如fork或exec创建的新进程,在使用exec创建新进程时,需要将管道的文件描述符作为参数传递给exec创建的新进程。当父进程与使用fork创建的子进程直接通信时,发送数据的进程关闭读端,接受数据的进程关闭写端。 3、单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。 4、数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾

进程间通信(IPC)

Deadly 提交于 2019-12-02 06:42:05
一、进程间通信的概念 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为 进程间通信(IPC,InterProcess Communication) 进程间通信模型 二、进程间通信的7种方式 1. 管道/匿名管道(pipe) 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。 进程间管道通信模型 管道的实质 : 管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据,管道一端的进程顺序的将数据写入缓冲区,另一端的进程则顺序的读出数据。 该缓冲区可以看做是一个循环队列,读和写的位置都是自动增长的,不能随意改变,一个数据只能被读一次,读出来以后在缓冲区就不复存在了。 当缓冲区读空或者写满时

Linux 的 进程/线程 通信方式总结

旧城冷巷雨未停 提交于 2019-12-02 05:44:29
linux 系统中的进程通信方式主要以下几种: PIPE(FIFO) 消息队列 信号量(Semaphore) 共享存储 SOCKET 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程通信方式:包括信号量(Semaphore), 消息队列(Message Queue), 和共享内存(Shared Memory) 网络主机间的进程通信方式 * RPC: Remote Procedure Call 远程过程调用 * Socket: 当前最流行的网络通信方式, 基于TCP/IP协议的通信方式. 各自的特点: 管道(PIPE):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系(父子进程)的进程间使用。另外管道传送的是无格式的字节流,并且管道缓冲区的大小是有限的(管道缓冲区存在于内存中,在管道创建时,为缓冲区分配一个页面大小)。 有名管道 (FIFO): 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 信号(Signal): 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 信号量(Semaphore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此

进程间通信之pipe

人盡茶涼 提交于 2019-12-01 08:34:54
实现数据传递 两个进程之间通信 多个进程之间通信,会导致数据不安全,需要加锁, 示例 分类 无名管道:父子间进程通信 有名管道:父子间进程通信;任意两个进程之间通信 创建管道方法 os.mkfifo(pipe_name) os.pipe() from multiprocessing import Pipe 三方包 https://www.jianshu.com/p/344c3f47b21a 来源: https://www.cnblogs.com/shengulong/p/11673390.html

Python进程间通信之匿名管道

别说谁变了你拦得住时间么 提交于 2019-11-29 22:16:16
匿名管道 管道是一个单向通道,有点类似共享内存缓存.管道有两端,包括输入端和输出端.对于一个进程的而言,它只能看到管道一端,即要么是输入端要么是输出端. os.pipe()返回2个文件描述符(r, w),表示可读的和可写的.示例代码如下: #!/usr/bin/python import time import os def child (wpipe) : print( 'hello from child' , os.getpid()) while True : msg = 'how are you\n' .encode() os.write(wpipe, msg) time.sleep( 1 ) def parent () : rpipe, wpipe = os.pipe() pid = os.fork() if pid == 0 : child(wpipe) assert False , 'fork child process error!' else : os.close(wpipe) print( 'hello from parent' , os.getpid(), pid) fobj = os.fdopen(rpipe, 'r' ) while True : recv = os.read(rpipe, 32 ) print recv parent() 输出如下: (

进程间通信:管道及命名管道(代码实现)

六月ゝ 毕业季﹏ 提交于 2019-11-29 22:12:15
管道:1.管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 2.只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 3.单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统, 并且只存在与内存中; 4.数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据; 5.管道通信是于流式符的; 6.管道的生命周期是随进程的; 7.管道已经给进程提供了同步与互斥; pipe: 当一个管道建立时,它会创建两个文件描述符pipefd[0]和pipefd[1]。其中pipefd[0]固定用于读管道,而pipefd[1]固定用于写管道,一般文件I/O的函数都可以用来操作管道。 测试pipe的大小 单独创建一个无名管道,并没有实际的意义。我们一般是在一个进程在由pipe()创建管道后,一般再由fork一个子进程,然后通过管道实现父子进程间的通信(因此也不难推出,只要两个进程中存在亲缘关系,这里的亲缘关系指的是具有共同的祖先,都可以采用管道方式来进行通信)。 代码: 结果: 使用管道需要注意以下4中情况: 1.如果所有指向管道写端的文件描述符没关闭,而持有管道写端的进程也没有向管道中写数据

进程间通信-匿名管道

Deadly 提交于 2019-11-29 22:11:51
匿名管道 一、特点 1.只适合单向通信。(如果需要双向通信,则需要两个匿名管道来进行完成) 2.只适合具有血缘关系的进程进行通信 3.管道是文件,生命周期随进程,进程结束后,文件就不在了 4.管道是基于字节流方式来进行通信的 5.父进程和子进程访问的公共资源叫做临界资源,所有临界资源都是需要被保护起来的,多个进程进行访问时必须要保证原子性。(任一时刻保证只有一个人访问) 6.管道内部自己已经实现同步性,能保证数据的一致性。 另外,进程间的通信的本质是:两个进程看到了一份公共的资源。 二、管道的创建 1.由父进程创建,子进程继承父进程的文件描述符,指向同一个文件,一个用来读,一个用来写,适当的关闭相应的文件读写端。 函数功能:创建管道,使得__pipe[0]指向文件的读端,_pipe[1]指向文件的写端 参数:一个含有两个整型元素的数组 返回值:0正常 -1管道创建失败 2.管道的大小 测试匿名管道的大小: #include<stdio.h> #include<unistd.h> #include<stdlib.h> int main() { int fd[ 2 ]; int count= 0 ; if (pipe(fd)< 0 ) { perror( "Fail to create pipe" ); exit ( 1 ); } while ( 1 ) { write(fd[ 1 ]

linux各种IPC机制

≯℡__Kan透↙ 提交于 2019-11-29 11:06:08
linux各种IPC机制   docker中的资源隔离,一种就是IPC的隔离。IPC是进程间通信。 下面的文章转载自https://blog.csdn.net/yyq_9623/article/details/78794775 原帖发表在IBM的developerworks网站上,是一个系列的文章,作者郑彦兴,通过讲解和例子演示了Linux中几种IPC的使用方式,我觉得很好,在这里做一个保留,能看完的话Linux IPC的基础是没有问题的了。 一)Linux环境进程间通信(一)管道及有名管道 http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/ 二)Linux环境进程间通信(二): 信号 上: http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html 下: http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html 三)Linux环境进程间通信(三)消息队列 http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 四)Linux环境进程间通信(四)信号灯 http://www.ibm.com/developerworks