当前位置: 首页 > news >正文

linux有名管道的文件描述符3和4

在使用有名管道(Named Pipe,FIFO)时,返回的文件描述符 3 和 4 是通过 open() 系统调用打开有名管道后分配的文件描述符。文件描述符是进程用来访问打开的文件或管道的整数标识符。


1. 文件描述符的分配规则

  • 文件描述符是一个非负整数,通常是当前进程未使用的最小整数。

  • 默认情况下,每个进程已经打开了三个标准的文件描述符:

    • 0:标准输入(stdin)

    • 1:标准输出(stdout)

    • 2:标准错误(stderr)

  • 因此,当进程第一次打开一个文件或管道时,通常会分配文件描述符 3,第二次打开时会分配 4,依此类推。


2. 有名管道返回 3 和 4 的场景

假设一个进程通过 open() 系统调用两次打开同一个有名管道:

int fd1 = open("/tmp/my_fifo", O_RDONLY);  // 返回 3
int fd2 = open("/tmp/my_fifo", O_WRONLY);  // 返回 4
 
  • 第一次调用 open() 时,返回的文件描述符是 3,因为 0、1、2 已经被标准输入、输出和错误占用。

  • 第二次调用 open() 时,返回的文件描述符是 4,因为 3 已经被第一次调用占用。


3. 文件描述符的作用

  • 文件描述符是进程与内核之间的桥梁,用于标识打开的文件、管道、套接字等。

  • 在有名管道的场景中:

    • 文件描述符 3 可以用于从管道读取数据(如果以 O_RDONLY 模式打开)。

    • 文件描述符 4 可以用于向管道写入数据(如果以 O_WRONLY 模式打开)。


4. 示例代码

以下是一个使用有名管道的示例代码,展示了文件描述符的分配和使用:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>

int main() {
    // 创建有名管道
    mkfifo("/tmp/my_fifo", 0666);

    // 打开有名管道(读取端)
    int fd1 = open("/tmp/my_fifo", O_RDONLY);
    printf("Opened FIFO for reading, fd = %d\n", fd1);

    // 打开有名管道(写入端)
    int fd2 = open("/tmp/my_fifo", O_WRONLY);
    printf("Opened FIFO for writing, fd = %d\n", fd2);

    // 写入数据
    char *msg = "Hello, FIFO!";
    write(fd2, msg, 13);
    printf("Data written to FIFO\n");

    // 读取数据
    char buf[128];
    read(fd1, buf, sizeof(buf));
    printf("Data read from FIFO: %s\n", buf);

    // 关闭文件描述符
    close(fd1);
    close(fd2);

    // 删除有名管道
    unlink("/tmp/my_fifo");

    return 0;
}
 

5. 总结

  • 有名管道返回的文件描述符 3 和 4 是通过 open() 系统调用分配的。

  • 文件描述符是进程访问有名管道的标识符,用于读写操作。

  • 文件描述符的分配遵循最小可用整数的规则,通常从 3 开始(因为 0、1、2 已被标准输入、输出和错误占用)。

http://www.dtcms.com/a/26273.html

相关文章:

  • 个人简历html网页模板,科技感炫酷html简历模板
  • DeepSeek API调用 Python
  • Hive中的分区和桶的概念及其作用
  • 网络工程师 (47)QOS
  • 小怿学习日记(七) | Unreal引擎灯光架构
  • 【wrk】wrk 压测工具入门
  • DeepSeek与ChatGPT的对比分析
  • K8s 之端口暴露(The Port of K8s is Exposed)
  • Jmeter连接数据库、逻辑控制器、定时器
  • SOME/IP--协议英文原文讲解8
  • 《魔女的夜宴》无广版手游安卓苹果免费下载直装版
  • 红蓝对抗之常见网络安全事件研判、了解网络安全设备、Webshell入侵检测
  • Mac端homebrew安装配置
  • P1115 最大子段和
  • fps僵尸:8.丧尸死亡
  • 解决 Mac 只显示文件大小,不显示目录大小
  • 图的最小生成树算法: Prim算法和Kruskal算法(C++)
  • EasyRTC:开启智能硬件与全平台互动新时代
  • 01数据准备 抓取图片 通过爬虫方式获取bing的关键词搜索图片
  • 优先队列(典型算法思想)—— OJ例题算法解析思路
  • 撕碎QT面具(6):调节窗口大小后,控件被挤得重叠的解决方法
  • SLT-加载表添加字段重新刷数
  • YOLOv10改进系列 ---- Conv篇 ---- 2024利用 Haar 小波的下采样HWD替换传统下采样
  • 传入一个list map,寻找最大的key和对应的vlaue
  • 快速定位并优化CPU 与 JVM 内存性能瓶颈
  • 黑客入侵动图特效实现
  • linux下pip下载项目失败
  • Vue.js 入门指南:从基础到实战
  • 解析跨域:原理、解决方案与实践指南
  • 算法日记20:SC72最小生成树(prim朴素算法)