Linux 进程操作
1. fork()
函数
- 作用:创建一个新的进程,称为子进程。子进程是调用进程(父进程)的副本。
- 参数:
- 无参数。
- 返回值:
- 在父进程中返回子进程的 PID。
- 在子进程中返回 0。
- 若出错,返回 -1。
- 示例:
pid_t pid = fork(); if (pid < 0) { // 错误处理 } else if (pid == 0) { // 子进程代码 } else { // 父进程代码 }
2. execve()
函数
- 作用:执行一个新程序,替换当前进程的地址空间。
- 参数:
const char *path
:要执行的程序路径。char *const argv[]
:参数列表,以 NULL 结尾。char *const envp[]
:环境变量列表,以 NULL 结尾。
- 返回值:
- 成功时不会返回。
- 失败时返回 -1,并设置
errno
。
- 示例:
char *argv[] = {"/bin/ls", "-l", NULL}; char *envp[] = {NULL}; execve("/bin/ls", argv, envp);
3. waitpid()
函数
- 作用:等待指定的子进程终止,并获取其状态。
- 参数:
pid_t pid
:要等待的子进程 PID。int *status
:用于存储子进程状态的指针。int options
:选项标志,如WNOHANG
。
- 返回值:
- 成功时返回子进程的 PID。
- 若没有子进程退出且
WNOHANG
被设置,返回 0。 - 失败时返回 -1。
- 示例:
waitpid(pid, &status, 0);
4. getpid()
函数
- 作用:获取当前进程的 PID。
- 参数:无。
- 返回值:当前进程的 PID。
- 示例:
printf("Current PID: %d\n", getpid());
5. getppid()
函数
- 作用:获取当前进程的父进程 PID。
- 参数:无。
- 返回值:当前进程的父进程 PID。
- 示例:
printf("Parent PID: %d\n", getppid());
6. exit()
函数
- 作用:终止当前进程,并返回一个状态码。
- 参数:
int status
:进程退出状态码。
- 示例:
exit(EXIT_SUCCESS);
7. sleep()
函数
- 作用:使当前进程休眠指定的秒数。
- 参数:
unsigned int seconds
:休眠的秒数。
- 返回值:实际休眠的秒数。
- 示例:
sleep(2); // 休眠 2 秒
8. pause()
函数
- 作用:使当前进程暂停,直到收到信号。
- 参数:无。
- 返回值:总是返回 -1,并设置
errno
为 EINTR。 - 示例:
pause(); // 等待信号
9. system()
函数
- 作用:执行一个 shell 命令。
- 参数:
const char *command
:要执行的命令。
- 返回值:
- 成功时返回命令的退出状态。
- 失败时返回 -1。
- 示例:
system("ls -l"); // 执行 ls -l 命令
10. pipe()
函数
- 作用:创建一个管道,用于进程间通信。
- 参数:
int pipefd[2]
:用于存储管道读写文件描述符的数组。
- 返回值:
- 成功时返回 0。
- 失败时返回 -1。
- 示例:
int pipefd[2]; pipe(pipefd);
11. read()
和 write()
函数
- 作用:分别用于从文件描述符读取数据和向文件描述符写入数据。
- 参数:
int fd
:文件描述符。void *buf
:缓冲区。size_t count
:要读取或写入的字节数。
- 返回值:
- 成功时返回实际读取或写入的字节数。
- 失败时返回 -1。
- 示例:
char buffer[100]; read(fd, buffer, sizeof(buffer)); write(fd, "Hello, World!", strlen("Hello, World!"));
12. close()
函数
- 作用:关闭一个文件描述符。
- 参数:
int fd
:要关闭的文件描述符。
- 返回值:
- 成功时返回 0。
- 失败时返回 -1。
- 示例:
close(fd);
13. dup()
和 dup2()
函数
- 作用:复制文件描述符。
- 参数:
int oldfd
:要复制的文件描述符。int newfd
:新文件描述符(dup2
特有)。
- 返回值:
- 成功时返回新文件描述符。
- 失败时返回 -1。
- 示例:
dup(oldfd); dup2(oldfd, newfd);
14. execl()
, execlp()
, execv()
, execvp()
函数
- 作用:执行一个新程序,与
execve()
类似,但参数传递方式不同。 - 参数:
const char *path
:要执行的程序路径。char *const argv[]
:参数列表,以 NULL 结尾。char *const envp[]
:环境变量列表,以 NULL 结尾(execve
特有)。
- 返回值:
- 成功时不会返回。
- 失败时返回 -1。
- 示例:
execl("/bin/ls", "ls", "-l", NULL); execvp("ls", argv);
15. getuid()
和 geteuid()
函数
- 作用:获取当前进程的真实用户 ID 和有效用户 ID。
- 参数:无。
- 返回值:用户 ID。
- 示例:
printf("Real UID: %d\n", getuid()); printf("Effective UID: %d\n", geteuid());
16. getgid()
和 getegid()
函数
- 作用:获取当前进程的真实组 ID 和有效组 ID。
- 参数:无。
- 返回值:组 ID。
- 示例:
printf("Real GID: %d\n", getgid()); printf("Effective GID: %d\n", getegid());
17. setuid()
和 setgid()
函数
- 作用:设置当前进程的有效用户 ID 和组 ID。
- 参数:
__uid_t uid
:要设置的用户 ID。__gid_t gid
:要设置的组 ID。
- 返回值:
- 成功时返回 0。
- 失败时返回 -1。
- 示例:
setuid(1000); setgid(1000);
18. nice()
函数
- 作用:调整当前进程的优先级。
- 参数:
int inc
:优先级调整值。
- 返回值:
- 成功时返回新的优先级。
- 失败时返回 -1。
- 示例:
nice(10); // 调整优先级
19. alarm()
函数
- 作用:设置一个定时器,在指定秒数后发送
SIGALRM
信号。 - 参数:
unsigned int seconds
:定时器时间(秒)。
- 返回值:
- 成功时返回剩余时间。
- 失败时返回 0。
- 示例:
alarm(5); // 5 秒后发送 SIGALRM 信号
20. signal()
函数
- 作用:设置信号处理函数。
- 参数:
int signum
:信号编号。void (*handler)(int)
:处理函数。
- 返回值:
- 成功时返回之前的处理函数。
- 失败时返回 SIG_ERR。
- 示例:
signal(SIGINT, handler); // 设置 SIGINT 信号处理函数
这些函数是 Linux 进程操作的基础,理解它们的作用、参数和使用方法对于开发和调试多进程应用程序至关重要。