在Linux操作系统中,创建子进程是系统编程中的一个基本任务,子进程可以帮助我们实现多任务处理,提高程序的执行效率,本文将详细介绍如何在Linux中创建子进程,并分享一些实际应用案例。

Linux中创建子进程的方法
在Linux中,创建子进程主要有两种方法:使用fork()函数和exec()函数。
使用fork()函数创建子进程
fork()函数是创建子进程最常用的方法,以下是fork()函数的基本用法:
pid_t fork(void);
当调用fork()函数时,会返回两个值:
- 如果返回值为0,表示子进程。
- 如果返回值大于0,表示父进程,返回值是子进程的PID。
- 如果返回值为-1,表示创建子进程失败。
下面是一个使用fork()函数创建子进程的示例:

#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程
printf("This is child process.\n");
} else {
// 父进程
printf("This is parent process, PID of child process is %d.\n", pid);
}
return 0;
}
使用exec()函数创建子进程
exec()函数用于替换子进程的当前映像,并开始执行新的程序,以下是exec()函数的基本用法:
int execl(const char *path, const char *arg, ...); int execv(const char *path, char *const argv[]); int execle(const char *path, const char *arg, ...); int execlp(const char *path, const char *arg, ...); int execvp(const char *path, char *const argv[]); int execve(const char *path, char *const argv[], char *const envp[]);
下面是一个使用exec()函数创建子进程的示例:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程
execl("/bin/ls", "ls", "-l", (char *)NULL);
// 如果execl执行成功,则不会执行到下面的代码
perror("execl failed");
exit(1);
} else {
// 父进程
wait(NULL);
printf("Parent process continues.\n");
}
return 0;
}
经验案例
以下是一个使用fork()和exec()函数创建子进程,并执行不同命令的经验案例:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid1 = fork();
if (pid1 == 0) {
// 子进程1
execl("/bin/ls", "ls", "-l", (char *)NULL);
perror("execl failed");
exit(1);
} else if (pid1 > 0) {
// 父进程
wait(NULL);
pid_t pid2 = fork();
if (pid2 == 0) {
// 子进程2
execl("/usr/bin/wc", "wc", "-l", "/etc/passwd", (char *)NULL);
perror("execl failed");
exit(1);
} else if (pid2 > 0) {
// 父进程
wait(NULL);
printf("Parent process continues.\n");
} else {
// fork失败
perror("fork failed");
exit(1);
}
} else {
// fork失败
perror("fork failed");
exit(1);
}
return 0;
}
FAQs
问题1:如何判断子进程是否执行成功?
解答:在子进程中,如果exec()函数执行成功,则不会执行到下面的代码,如果执行失败,可以通过perror()函数打印错误信息。

问题2:如何避免子进程在父进程中等待?
解答:可以使用waitpid()函数代替wait()函数,并指定要等待的子进程PID,这样,父进程就可以继续执行,而不会在等待子进程时阻塞。
文献权威来源
《Linux内核设计与实现》
《Linux系统编程》















