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 查看消息队列