有名管道 ----> 进程间通信相关(FIFO)(有代码)

有名管道(Named Pipe)和无名管道(Anonymous Pipe)的区别:

特性 有名管道(Named Pipe) 无名管道(Anonymous Pipe)
命名 有文件名,存在于文件系统中(如 FIFO 文件)。 没有文件名,仅存在于内存中。
进程间关系 可用于任意进程间通信(不限于父子进程)。 仅用于具有亲缘关系的进程间通信(如父子进程)。
持久性 持久存在,直到被删除。 随进程结束而销毁。
创建方式 使用 mkfifo 或 mknod 创建。 使用 pipe() 系统调用创建。
通信方向 双向通信(全双工)。 单向通信(半双工)。
使用场景 适用于任意进程间通信,尤其是无亲缘关系的进程。 适用于父子进程或兄弟进程间通信。

适用场景

有名管道(Named Pipe)
1. 无亲缘关系的进程间通信:
   - 适用于不同终端或不同用户的进程间通信。
   - 例如:一个进程写入日志,另一个进程读取日志。
2. 持久化通信:
   - 管道在文件系统中存在,通信可以跨多个会话。
   - 例如:服务器和客户端之间的长期通信。
3.*双向通信:
   - 支持全双工通信,适合需要双向交互的场景。
   - 例如:客户端发送请求,服务器返回响应。

 无名管道(Anonymous Pipe)
1. 父子进程或兄弟进程间通信:
   - 适用于具有亲缘关系的进程间通信。
   - 例如:父进程创建子进程,父子进程通过管道交换数据。
2. 临时通信:
   - 管道随进程结束而销毁,适合临时任务。
   - 例如:Shell 命令中的管道操作(如 `ls | grep .txt`)。
3. 单向通信:
   - 适合单向数据流场景。
   - 例如:一个进程生成数据,另一个进程处理数据。

总结

- 有名管道:适合任意进程间通信,尤其是无亲缘关系的进程,支持持久化和双向通信。
- 无名管道:适合具有亲缘关系的进程间通信,临时任务和单向数据流。

根据具体需求选择合适的管道类型,可以更高效地实现进程间通信。

所需要头文件#include

有名管道的“管道”被持久化为一个文件。

创建有名管道mkfifo()函数的第一个参数(输入型参数)是管道文件的地址(常量字符指针--->const char*)

管道写入端

#define FIFO_PATH "/tmp/myfifo"

int main()
{
    mkfifo(FIFO_PATH,0777);

    char* msg = "surprise mother fucker";

    int fd = open(FIFO_PATH,O_WRONLY);

    write(fd,msg,strlen(msg));
    
    close(fd);

    return 0;
}

管道读取端

#define FIFO_PATH "/tmp/myfifo"

int main()
{
    mkfifo(FIFO_PATH,0777);

    char data[100] = {0};

    int fd = open(FIFO_PATH,O_WRONLY);

    read(fd,data,sizeof(data));

    printf("read:%s\n",data);
    
    close(fd);

    return 0;
}

你可能感兴趣的:(网络,linux,运维,c语言)