ipc

popen to pass binary data between processes

走远了吗. 提交于 2020-01-14 05:49:06
问题 I am facing issue in passing binary data between processes. My program opens a pipe to ffmpeg using popen() and tries to capture the output and then stream it as HTTP server. I am doing something like this ffmpeg -i "input_video.avi" -ab 56 -ar 44100 -b 1500000 -r 25 -s 800x600 -f flv - (Output filename "-" diverts the output to stdout) After opening I am using fread() to read the pipe. I can read it and my program streams content, when I downloaded the file on my browser, it completed, but

Linux 进程间通信(IPC)

老子叫甜甜 提交于 2020-01-13 20:12:06
Linux 进程间通信(IPC): Linux系统中除了进程和进程之间通信,我想大家也应该关注用户空间与内核空间是怎样通信的。例如说netlink等等。 除了传统进程间通信外像Socket通信也须要掌握的! /*-------------------------------------------------------------------------- * Project: aipc.c * Name: zwp * Date: 2014/6 *-------------------------------------------------------------------------*/ #include <sys/types.h> #include <sys/wait.h> #include <sys/socket.h> #include <unistd.h> #include <signal.h> #include <stdlib.h> #include <stdio.h> #define MAXLINE 1024 static void sig_pipe(int); int s_pipe(int fd[2]); int main(void) { int n, fd[2]; pid_t pid; char line[MAXLINE]; if(signal

IPC之套接字

陌路散爱 提交于 2020-01-13 20:09:05
IPC(Inter-Process Communication,进程间通信)实现方式   1)管道:     - 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用(进程的亲缘关系通常是指父子进程关系)   2)有名管道(FIFO):     - 有名管道也是半双工的通信方式,但是允许在没有亲缘关系的进程之间使用,管道是先进先出的通信方式   3)信号量:     - 信号量是一个计数器,可以用来控制多个进程对共享资源的访问     - 它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源     - 因此,主要作为进程间以及同一进程内不同线程之间的同步手段   4)消息队列:     - 消息队列是有消息的链表,存放在内核中,并由消息队列标识符标识     - 消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点   5)信号 ( Sinal ) :     - 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生   6)共享内存( Shared Memory) :     - 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问     - 共享内存是最快的IPC实现机制,它是针对其它进程间通信方式运行效率低而专门设计的     -

linux下关于IPC(进程间通信)

China☆狼群 提交于 2020-01-13 20:02:44
linux下进程间通信的主要几种方式 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信; 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数); 报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。 套接口(Socket):更为一般的进程间通信机制

linux各种IPC机制

别等时光非礼了梦想. 提交于 2020-01-13 19:50:47
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

Linux进程间通信:消息队列

两盒软妹~` 提交于 2020-01-13 19:38:36
一、消息队列的特点 1.消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识. 2.消息队列允许一个或多个进程向它写入与读取消息. 3.管道和命名管道都是通信数据都是先进先出的原则。 4.消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比FIFO更有优势。 目前主要有两种类型的消息队列:POSIX消息队列以及系统V消息队列,系统V消息队列目前被大量使用。系统V消息队列是随内核持续的,只有在内核重起或者人工删除时,该消息队列才会被删除。 二、相关函数 1. 获得key值 key_t ftok(char *pathname, int projid) #include <sys/types.h> #include <sys/ipc.h> 参数: pathname:文件名(含路径),通常设置为当前目录“.” projid:项目ID,必须为非0整数(0-255). 2. 创建消息队列 int msgget(key_t key, int msgflag) #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> 功能: 用于创建一个新的或打开一个已经存在的消息队列,此消息队列与key相对应。 参数: key:函数ftok的返回值或IPC_PRIVATE。

(1)IPC简介

笑着哭i 提交于 2020-01-13 19:20:27
Unix/Linux IPC简介 简述 1. 消息传递演变过程 2. 同步形式演变 进程、线程与信息共享 IPC对象的持续性 名字空间 fork、exec和exit对IPC对象的影响 总结 参考资料 简述 IPC是进程间通信(interprocess communication)的简称。用来描述运行在一个操作系统之上的不同进程间各种消息传递的方式。 IPC在使用过程中需要同步参与一起运行。 1. 消息传递演变过程 管道(pipe):只能在具有共同祖先(指父子进程关系)的进程间使用,有名管道fifo可以在任意进程间使用 System V消息队列:可在同一主机上有亲缘关系或无亲缘关系的进程间使用。 Posix消息队列:可在同一主机上有亲缘关系或无亲缘关系的进程间使用。 远程过程调用: 2. 同步形式演变 使用文件系统特性同步 记录上锁(record-locking) System V信号量 Posix信号量和Posix共享内存区 互斥锁(mutex)和条件变量(condition variable):主要用于线程间同步,也能提供进程间的同步 读写锁(read-write-lock) 进程、线程与信息共享 unix/linux间信息共享的三种方式 两个进程共享存储在文件系统中的某个文件上的信息。访问该文件,每个进行都要经过内核(如read,write,lseek等)

进程间通信六(消息队列)

China☆狼群 提交于 2020-01-13 18:40:06
一、消息队列的特点 1.消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识. 2.消息队列允许一个或多个进程向它写入与读取消息. 3.管道和命名管道都是通信数据都是先进先出的原则。 4.消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比FIFO更有优势。 目前主要有两种类型的消息队列: POSIX消息队列以及系统V消息队列,系统V消息队列目前被大量使用。系统V消息队列是随内核持续的,只有在内核重起或者人工删除时,该消息队列才会被删除。 二、相关函数 1. 获得key值 key_t ftok(char *pathname, int projid) #include <sys/types.h> #include <sys/ipc.h> 参数: pathname:文件名(含路径), 通常设置为当前目录“.” 比如projid为'a',则为"./a"文件 projid:项目ID,必须为非0整数(0-255). 2. 创建消息队列 int msgget(key_t key, int msgflag) #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> 功能: 用于创建一个新的或打开一个已经存在的消息队列,此消息队列与key相对应。 参数: key

Linux 进程间通信 --消息队列

醉酒当歌 提交于 2020-01-13 18:36:34
一、消息队列   消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。   每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。   但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。   消息队列是系统内核地址空间中的一个内部的链表。消息可以按照顺序发送到队列中,也可以以几种不同的方式从队列中读取。每一个消息队列用一个唯一的IPC标识符表示。 二、   在<sys/msg.h>中,消息队列的数据结构是这样定义的: struct msgbuf{ long mtype; /*type of message, must>0*/ char mtext[1]; /*message text*/ }; 在数据结构msgbuf中共有两个元素: mtype指消息的类型,它由一个整数来代表,并且它只能是大于0的整数。 mtext是消息数据本身。 mtext字段不但可以存储字符,还可以存储任何其他的数据类型。此字段可以说是完全任意的,因为程序员自己可以重新定义此数据结构。请看下面重新定义的例子: struct my_msgbuf{ long mtype; /*Message type*/ char request_id; /*Request identifier*/ struct client

message queue in C: implementing 2 way comm

雨燕双飞 提交于 2020-01-13 14:56:18
问题 I am a student and a begineer in C. I want to implement 2 way communication using message queue in C linux. Do I need two queues or only one to get this done? Also I would like to know can I send data(shown in code) to another process or i need to declare it as a character array. typedef struct msg1 { int mlen; char *data; }M1; typedef struct msgbuf { long mtype; M1 *m; } message_buf; Thanks in advance :) 回答1: Also I would like to know can I send data(shown in code) to another process or i