进程间通信IPC
来源:互联网 发布:古风网络歌曲 编辑:程序博客网 时间:2024/05/22 00:42
1. 管道:
关系进程的进程间通信
父子关系
没有关系的进程通过信号进行通信
管道比共享内存的实时性好
Linux下默认遵守POSIX的进程间通信匿名管道(管道pipe) 命名管道(FIFO)
- 套接字 高级IPC 不同主机间通信
- 管道通信最常见的IPC方式
4. 管道创建
include
int pipe(int fd[2]);返回:成功为0 ,失败为-1.管道的数据结构全部在内核空间完成;保护、安全。
管道通信《他没有自己的名字,所以叫匿名管道,只能拿到关联到两个文件的文件描述符》对管道的操作完全依赖这两个文件描述符。
代码示例:
#include "io.h"#include <time.h>int main(int argc, char const *argv[]){ int fds[2];/*栈区*//*单工,否则容易造成数据混乱*/ /*在当前进程 父进程里建立一个管道*/ if (pipe(fds) < 0) { fprintf(stderr, "pipe:%s\n", strerror(errno)); return -1; } /*先建立好管道 ,再建立子进程,子进程会继承父进程的堆区、栈区,否则不会继承*/ pid_t pid = fork(); if (pid < 0) { fprintf(stderr, "fork:%s\n", strerror(errno)); return -1; } else if (pid == 0) { close(fds[1]);/*父进程写*/ char buffer[100] = {'\0'}; read(fds[0], buffer, 100); printf("in child, buffer:%s\n", buffer); } else { close(fds[0]);/*关闭不需要的端口*/ time_t t = time(NULL); char* ct = ctime(&t); /*send child process*/ write(fds[1], ct, strlen(ct)); wait(0); } /*sleep(1);*//*管道要正常使用,必须保证两端都打开。 父进程要等待子进程,确保子进程读完,让他们把交互的过程完成,但是时间不一定,也没有办法打保票它完全成功,所以可以用wait*/ return 0;}
兄弟进程间的通信,可以通过继承父进程进行。
有名管道:
文件的形式体现。
用户可以看到有名管道的操作和文件的操作一样。屏蔽了关系进程,不需要限定关系进程。
管道破裂。break pipe.
注意:
写数据之前要保证有人以只读的方式打开。
三、
#include "io.h"int main(int argc, char const *argv[]){ /*FILE* fp = popen("grea\p root", "w");*/ FILE* fp = popen("cat /etc/passwd", "r");/*会创建子进程,子进程来写数据*/ char buffer[1024] = {'\0'}; fread(buffer, 1024, 1, fp); printf("buffer:%s\n", buffer); return 0;}
mkfifo s.pipe
消息队列
ipcs
ipcs -q 查看消息队列
阅读全文
0 0
- 进程间通信IPC
- 进程间通信IPC
- 进程间通信IPC
- 进程间通信IPC
- IPC进程间通信
- IPC进程间通信
- 进程间通信 IPC
- IPC进程间通信
- 进程间通信IPC
- IPC进程间通信
- IPC进程间通信
- 进程间通信(IPC)
- 进程间通信IPC
- 进程间通信IPC
- 进程间通信IPC
- 进程间通信 ---IPC
- 进程间通信IPC
- 进程间通信IPC
- 这名程序猿吐了一管口水,便迎来了人生的四大暴击…
- iOS TableViewCell ~reuseIdentifier(标识符)
- 使用Anaconda安装tensorflow
- RK3399(3)
- POJ 2162(模拟) 改不对,,
- 进程间通信IPC
- 第三章 关系数据库标准语言SQL
- 链表的生长于翻转
- RK3399(4)
- [caffe学习笔记]用自己的数据进行训练和测试
- Android键盘输入法(二)——输入法的可见性
- curl_multi_select解决curl_multi网页假死问题
- [Qt]如何用好QScrollArea
- poj2289--Jamie's Contact Groups(二分多重匹配)