C++ unistd.h库文件介绍(文件与目录操作, 进程管理, 系统环境访问, 底层I/O操作, 系统休眠/执行控制)
在这篇文章中,我们将详细介绍一下 C++(以及 C 语言)中的 unistd.h
头文件,包括背景、功能、常用函数以及使用场景。
1. unistd.h
的背景与作用
基本概念
unistd.h
是 Unix 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. 注意事项
- 不是标准 C++:标准 C++ 没有
unistd.h
,可移植性差。 - 线程安全:大部分函数是系统调用,线程安全性高,但注意不要在多线程中滥用阻塞调用。
- 建议封装:跨平台时可用宏判断:
#ifdef _WIN32 // Windows 版本 #include <windows.h> #else #include <unistd.h> #endif
- 与 C++ I/O 区别:
unistd.h
提供的是文件描述符级别的 I/O,与iostream
的 文件流 不同。
✅ 总结
unistd.h
是 Unix/Linux 系统中的核心 API 接口库,主要用于执行底层系统调用:文件/目录管理、进程控制、I/O 操作、系统信息获取等。它适合需要直接使用 POSIX 系统调用 的 C/C++ 程序,如操作系统编程、服务器后台开发等,但不适合纯跨平台的高层应用。