#include <unistd.h>

#include <unistd.h>
寻觅~流光#include <unistd.h>
1.介绍
<unistd.h>(UNIX Standard Header)是 POSIX 操作系统 API 的核心头文件之一,主要用于 Unix/Linux 系统编程。它提供了大量与 系统调用(System Calls) 相关的函数,涵盖 文件操作、进程控制、系统信息、终端管理、管道通信 等核心功能。
| 功能类别 | 主要函数 |
|---|---|
| 文件操作 | read(), write(), close(), unlink(), lseek(), fsync() |
| 进程控制 | fork(), exec(), getpid(), getppid(), exit(), _exit(), wait() |
| 系统信息 | gethostname(), getcwd(), chdir(), sysconf() |
| 时间管理 | sleep(), usleep()(已弃用,建议用 nanosleep()) |
| 终端/设备管理 | isatty(), ttyname(), tcgetpgrp(), tcsetpgrp() |
| 管道通信 | pipe() |
| 用户/权限管理 | getuid(), geteuid(), getgid(), getegid(), setuid(), setgid() |
| 符号链接管理 | symlink(), readlink() |
2. 核心函数详解
2.1 文件操作(File I/O)
(1) read() - 从文件描述符读取数据
1 | ssize_t read(int fd, void *buf, size_t count); |
功能:从文件描述符
fd读取最多count字节到buf。返回值:
- 成功:返回实际读取的字节数(可能小于
count)。 - 失败:返回
-1,并设置errno。
1
2
3
4
5
6
7
8
9
10
11
12
13
int main() {
int fd = open("test.txt", O_RDONLY);
char buf[100];
ssize_t bytes_read = read(fd, buf, sizeof(buf));
if (bytes_read > 0) {
write(STDOUT_FILENO, buf, bytes_read); // 输出到终端
}
close(fd);
return 0;
}- 成功:返回实际读取的字节数(可能小于
(2) write() - 向文件描述符写入数据
1 | ssize_t write(int fd, const void *buf, size_t count); |
功能:将
buf中的count字节写入fd。返回值:
- 成功:返回实际写入的字节数。
- 失败:返回
-1,并设置errno。
1
2
3
4
5
6
7
8
9
10
int main() {
int fd = open("output.txt", O_WRONLY | O_CREAT, 0644);
const char *msg = "Hello, World!\n";
write(fd, msg, strlen(msg));
close(fd);
return 0;
}
(3) close() - 关闭文件描述符
1 | int close(int fd); |
- 功能:关闭文件描述符
fd,释放系统资源。 - 返回值:
- 成功:
0。 - 失败:
-1(如fd无效)。
- 成功:
(4) unlink() - 删除文件
1 | int unlink(const char *pathname); |
功能:删除文件(类似
rm命令)。示例:
1
unlink("tempfile.txt"); // 删除文件
2.2 进程控制(Process Control)
(1) fork() - 创建子进程
1 | pid_t fork(void); |
功能:复制当前进程,创建一个 子进程。
返回值:
- 父进程:返回子进程的
PID(> 0)。 - 子进程:返回
0。 - 失败:返回
-1(如内存不足)。
- 父进程:返回子进程的
示例:
1
2
3
4
5
6
7
8
9
10
11
12
int main() {
pid_t pid = fork();
if (pid == 0) {
printf("Child Process (PID=%d)\n", getpid());
} else {
printf("Parent Process (Child PID=%d)\n", pid);
}
return 0;
}
(2) exec() 系列 - 执行新程序
1 | int execl(const char *path, const char *arg0, ..., NULL); |
功能:替换当前进程映像,运行新程序。
示例:
1
execl("/bin/ls", "ls", "-l", NULL); // 执行 `ls -l`
(3) exit() vs _exit()
| 函数 | 行为 |
|---|---|
exit() | 标准 C 库函数,会调用 atexit() 注册的函数,刷新缓冲区,然后终止进程。 |
_exit() | 直接终止进程,不刷新缓冲区(属于系统调用)。 |
示例:
1
2
3
4
5
6
7
8
int main() {
printf("This will be printed\n");
// exit(0); // 会刷新缓冲区
_exit(0); // 直接终止,可能不打印
}
2.3 系统信息(System Information)
(1) getpid() / getppid() - 获取进程 ID
1 | pid_t getpid(void); // 获取当前进程 PID |
(2) gethostname() - 获取主机名
1 | int gethostname(char *name, size_t len); |
示例:
1
2
3char hostname[100];
gethostname(hostname, sizeof(hostname));
printf("Hostname: %s\n", hostname);
(3) getcwd() - 获取当前工作目录
1 | char *getcwd(char *buf, size_t size); |
示例:
1
2
3char cwd[1024];
getcwd(cwd, sizeof(cwd));
printf("Current dir: %s\n", cwd);
2.4 时间管理(Time Management)
(1) sleep() - 暂停执行(秒级)
1 | unsigned int sleep(unsigned int seconds); |
示例:
1
sleep(2); // 暂停 2 秒
(2) usleep() - 暂停执行(微秒级,已弃用)
1 | int usleep(useconds_t usec); // 1 秒 = 1,000,000 微秒 |
- 替代方案:
nanosleep()(更精确)。
3. 高级用法
(1) 管道通信(pipe())
1 | int pipe(int pipefd[2]); |
功能:创建匿名管道,
pipefd[0]用于读,pipefd[1]用于写。示例:
1
2
3
4
5
6
7
8
9
10
11int fd[2];
pipe(fd);
if (fork() == 0) {
close(fd[0]); // 子进程关闭读端
write(fd[1], "Hello", 6);
} else {
close(fd[1]); // 父进程关闭写端
char buf[10];
read(fd[0], buf, sizeof(buf));
printf("Received: %s\n", buf);
}
(2) 文件描述符重定向(dup2())
1 | int dup2(int oldfd, int newfd); |
功能:复制
oldfd到newfd,可用于重定向输入/输出。示例:
1
2
3int fd = open("output.txt", O_WRONLY | O_CREAT, 0644);
dup2(fd, STDOUT_FILENO); // 标准输出重定向到文件
printf("This goes to output.txt\n");
4. 注意事项
平台兼容性:
<unistd.h>是 Unix/Linux 特有,Windows 不原生支持(但可通过 MinGW/Cygwin 兼容)。- Windows 替代方案:
<windows.h>+CreateProcess(),ReadFile(),WriteFile()等。
错误处理:
大多数函数失败时返回
-1,并设置errno,建议检查返回值:1
2
3if (write(fd, buf, len) == -1) {
perror("write failed");
}
缓冲区管理:
write()不一定一次性写完所有数据,可能需要循环写入。
5. 总结
<unistd.h> 是 Unix/Linux 系统编程的核心头文件,提供了:
- 文件 I/O(
read,write,close) - 进程管理(
fork,exec,exit) - 系统信息(
getpid,gethostname,getcwd) - 时间管理(
sleep,usleep) - 管道和重定向(
pipe,dup2)
适用于 系统工具开发、Shell 实现、守护进程(Daemon)、多进程编程 等场景。
评论
匿名评论隐私政策
TwikooWaline
✅ 你无需删除空行,直接评论以获取最佳展示效果









