进程间通信IPC

来源:互联网 发布:古风网络歌曲 编辑:程序博客网 时间:2024/05/22 00:42

1. 管道:

关系进程的进程间通信
父子关系
没有关系的进程通过信号进行通信
管道比共享内存的实时性好
Linux下默认遵守POSIX的进程间通信匿名管道(管道pipe) 命名管道(FIFO)

  1. 套接字 高级IPC 不同主机间通信
  2. 管道通信最常见的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 查看消息队列