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

C++ unistd.h库文件介绍(文件与目录操作, 进程管理, 系统环境访问, 底层I/O操作, 系统休眠/执行控制)

在这篇文章中,我们将详细介绍一下 C++(以及 C 语言)中的 unistd.h 头文件,包括背景、功能、常用函数以及使用场景。


1. unistd.h 的背景与作用

基本概念

  • unistd.hUnix Standard Header 的缩写,源于 POSIX(Portable Operating System Interface)标准。
  • 它提供了对 POSIX 操作系统 API 的访问,主要包含 系统调用接口(System Call Wrappers)。
  • 它并不是 C++ 标准库 的一部分,而是 Unix/Linux 系统特有的库,在 Windows 上通常不可直接使用(除非使用 Cygwin、WSL 等兼容层)。
  • 常见于 Unix 系列系统(Linux、macOS、BSD…)用于进行:
    • 文件与目录操作
    • 进程管理
    • 系统环境访问
    • 低层 I/O 操作
    • 系统休眠、执行控制等

2. 它提供的常见功能与函数

unistd.h 中,可以找到许多底层的 系统调用封装函数,主要包括:

2.1 文件与 I/O 操作

  • read(int fd, void *buf, size_t count)
    从文件描述符读取数据。
  • write(int fd, const void *buf, size_t count)
    向文件描述符写入数据。
  • close(int fd)
    关闭文件描述符。
  • lseek(int fd, off_t offset, int whence)
    改变文件偏移位置。
  • access(const char *pathname, int mode)
    检查文件的访问权限(如 R_OK, W_OK, X_OK)。

2.2 进程管理

  • fork()
    创建新进程(子进程)。
  • _exit(int status)
    立即终止进程(不执行清理)。
  • getpid()
    获取当前进程 PID。
  • getppid()
    获取父进程 PID。
  • exec 系列函数(execl, execv, execvp…)
    执行新程序。

2.3 系统控制

  • sleep(unsigned int seconds)
    休眠指定秒数。
  • usleep(useconds_t usec)
    休眠指定微秒数。
  • sysconf(int name)
    获取系统配置信息(如 CPU 核心数、内存页大小)。
  • pathconf(const char *path, int name)
    获取文件或目录相关的配置值。

2.4 用户与组信息

  • getuid() / geteuid()
    获取实际/有效用户 ID。
  • getgid() / getegid()
    获取实际/有效组 ID。

3. 使用场景

3.1 跨平台受限

  • unistd.h 不属于标准 C++ 头文件,仅在类 Unix 系统有效。
  • 若需跨平台,通常要对 unistd.h 功能做封装,并在 Windows 上用 Win32 API 代替。

3.2 常见应用

低层文件操作
#include <unistd.h>
#include <fcntl.h>int main() {int fd = open("test.txt", O_WRONLY | O_CREAT, 0644);const char *msg = "Hello Unix\n";write(fd, msg, 11);close(fd);return 0;
}

作用:不用 fstream,直接通过 文件描述符 写入数据。


进程创建
#include <unistd.h>
#include <iostream>int main() {pid_t pid = fork();if (pid == 0) {std::cout << "Child process, PID: " << getpid() << "\n";} else {std::cout << "Parent process, PID: " << getpid() << "\n";}
}

作用:Unix/Linux 下多进程开发(守护进程、服务器等)。


延时执行
#include <unistd.h>
#include <iostream>int main() {std::cout << "Wait for 2 seconds...\n";sleep(2);std::cout << "Done!\n";
}

作用:简单的等待,不依赖 <thread>


检查文件权限
#include <unistd.h>
#include <iostream>int main() {if (access("test.txt", R_OK) == 0) {std::cout << "You can read test.txt\n";} else {std::cout << "No read permission\n";}
}

作用:在操作文件前检查权限。


4. 注意事项

  1. 不是标准 C++:标准 C++ 没有 unistd.h,可移植性差。
  2. 线程安全:大部分函数是系统调用,线程安全性高,但注意不要在多线程中滥用阻塞调用。
  3. 建议封装:跨平台时可用宏判断:
    #ifdef _WIN32
    // Windows 版本
    #include <windows.h>
    #else
    #include <unistd.h>
    #endif
    
  4. 与 C++ I/O 区别unistd.h 提供的是文件描述符级别的 I/O,与 iostream文件流 不同。

总结
unistd.h 是 Unix/Linux 系统中的核心 API 接口库,主要用于执行底层系统调用:文件/目录管理、进程控制、I/O 操作、系统信息获取等。它适合需要直接使用 POSIX 系统调用 的 C/C++ 程序,如操作系统编程、服务器后台开发等,但不适合纯跨平台的高层应用。

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

相关文章:

  • golang 非error错误分类
  • 【如何生成专业级 API 接口文档:从规范到实战】
  • 指针实现数组的逆序存放并输出
  • IKE 与 ISAKMP 核心笔记
  • JCTools Spmc 单生产者-多消费者的无锁并发有界队列
  • 支持轻量化部署的混元3D世界模型Lite版本上线魔乐社区,昇腾部署实践来啦
  • FCT/ATE/ICT通用测试上位机软件
  • Leetcode—595. 大的国家【简单】
  • JUC之Fork/Join
  • WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析9
  • 2-3.Python 编码基础 - 类型检测与类型转换
  • Vue 实现可拖拽分割布局(支持左右、上下拖拽调整)
  • Java 学习笔记(基础篇7)
  • 2025年游戏盾SDK动态加密技术全景解析:从防御破解到重塑游戏安全基石
  • CSM5110 5V/1A降压芯片 SOT23-5封装 可替代RY3408 带OVP保护
  • vim的使用
  • 牛客面经1 滴滴社招-002
  • JAVA国际版多商户运营版商城系统源码多商户社交电商系统源码支持Android+IOS+H5
  • 哈希和字符串哈希
  • STM32 外设驱动模块七:红外反射式光电模块
  • Centos 8 管理防火墙
  • 安装Tailscale
  • Maven初识到应用
  • 【AI应用】向量数据库Milvus详细命令
  • Jenkins + SonarQube 从原理到实战四:Jenkins 与 Gerrit 集成并实现自动任务
  • Linux爆音问题解决方法(隔一会会有奇怪噪音)
  • Go 基础解析
  • 逛越南本地菜市场学英语
  • 异质结3.0时代的降本提效革命:捷造科技设备技术创新与产业拐点分析
  • DSPy框架:从提示工程到声明式编程的革命性转变