管道通信

Linux -- 进程间通信之管道

不羁岁月 提交于 2019-11-26 21:17:58
管道是 Linux 里的一种文件类型,同时也是 Linux 系统下进程间通信的一种方式 创建一个管道文件有两种方式: Shell 下命令 mkfifo + filename,即创建一个有名管道 C 语言里调用 pipe() 函数,创建一个无名管道 有名管道 / 无名管道 区别: 有名管道在程序外部使用 mkfifo 命令生成,无名管道在程序内部调用 pipe() 函数创建; 顾名思义,有名管道有文件名,无名管道没有文件名; 有名管道生成后直到删除都存在,无名管道在程序退出时则生命周期结束; 有名管道可以在任意两个进程间传输数据,无名管道只能在父子进程间传输数据; 注意:有名/无名管道都是半双工,即只能从一端向另一端发送数据,输入端与输出端在打开管道时是固定的 管道文件的特性 打开管道必须有两端(两个进程)同时打开一个管道,分别为读(r)和写(w);读取端负责从管道中读取数据,写入端负责向管道中输入数据; 当读端关闭,写端会收到信号,终止程序;当写端关闭,读端不再进入阻塞; 管道文件的大小始终为 0,打开管道文件时,在内存中为其分配空间,管道关闭后数据消失;Linux 默认 PIPE_SIZE(一个管道最大存储大小)为 64k,PIPE_BUF(管道缓冲区)为 4k;当对管道进行 write 操作时,若此时有多个进程同时写入一个管道,且写入的字节大小超过 PIPE_BUF

linux进程通信

廉价感情. 提交于 2019-11-26 20:10:00
linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、信号(signal)、消息队列、共享内存、信号量、套接字(socket)。 管道 管道是单向、先进先出的无结构的字节流。用于父子进程之间的通信。关键系统调用如下: int pipe( int fd[2] );fd数组用于返回两个fd,分别表示通道的两端。 int main(){ int pid; int fd[2]; if(pipe(fd)<0){//父进程创建管道 perror("Fail to pipe"); exit(EXIT_FAILURE); } if((pid=fork())<0){ perror("Fail to fork"); exit(EXIT_FAILURE); }else if(pid == 0){ close(fd[1]);//表示管道的方向,fd[1]用于写 child_read_pipe(fd[0]);//子进程读取管道 }else{ close(fd[0]);//fd[0]用于读 father_write_pipe(fd[1]);//父进程写入管道 } } 有名管道 有名管道以设备文件的形式存在,可被任意知道名字的进程使用,而不止在只有亲缘关系的进程之间。 要使用有名管道,必须先建立它,并与他的一段相连,才能打开进行读写。当文件不再需要时,要显示删除。系统调用: int mknod(

2019年8月9日星期五(系统编程)

家住魔仙堡 提交于 2019-11-26 17:15:53
2019 年 8 月 9 日星期五 一 . linux 多进程编程 - 通信方式。 1. 为什么进程之间要进行数据通信? 例子: ./test -> 开启一个名字为 test的进程。 ./project -> 开启一个名字为 project的进程。 通过学习通信方式,使得不同进程之间进行数据交换,例如 test进程发送数据给 project进程,从而控制 project进程运行状态。 2. 在 linux 下,通信方式有哪些?各自有什么特点? 以下几种方式属于系统编程的通信方式,只能同一台主机内部进程通信,不能跨主机。 1 )管道通信 管道通信分为有名管道与无名管道通信,管道也是 linux的一种特殊文件,进程可以写入数据到管道中,从而实现通信。 2 )信号 在 linux下,有非常多信号,例如暂停,继续,停止 ...,某一个进程通过发送信号给另外一个进程,从进行通信。 3 )消息队列 消息队列可以读取另外一个进程发送来的数据,而且可以读取特定的数据。 4 )共享内存 多个进程同时访问同一片内存空间。 能够跨主机通信的,只有网络编程才能实现 。 1 )套接字编程 可以实现不同的主机之间的通信。 二 . 进程之间通信 - 无名管道 1. 什么是无名管道?作用机制如何? 无名管道只能作用于亲缘关系的进程,例如父子进程。无名管道其实是数组来的,里面有读端与写端,进程只需要将数据写入

ADB管道通信

被刻印的时光 ゝ 提交于 2019-11-26 16:02:33
打開剪貼板: OpenClipboard 返回值為BOOL,成功返回非0,若失敗或剪貼板被佔用,返回0. CloseClipboard:關閉 EmptyClipboard:清空 前一個程序調用關閉,後一個程序調用清空后,打開剪貼板的當前窗口才擁有剪貼板。 SetClipboardData向剪貼板中防止數據。 參數: nFormat:剪貼板格式 hMem:具有指定格式的數據的句柄 ------------------------------------------------------------------- 延遲提交技術 ------------- 第一次調用SetClipboardData時,將其hMem參數設置為NULL,在剪貼板上以指定的剪貼板格式放置一個 空的剪貼板數據塊。然後直到其他進程需要數據或自身進程需要終止運行時再次調用SetClipboardData函數,這次 才真正提交數據(不需再調用OpenClipboard和EmptyClipboard) IsClipboardFormatAvailable(format)//檢測剪貼板上是否包含了參數format指定的格式的數據 GetClipboardData(CF_TEXT);//從剪貼板上獲得指定數據 --------------------------------------------------------