【Linux】从零开始认识进程 — 中上篇
在Linux中,进程是正在执行的程序的实例。每个进程都有自己的地址空间、内存、数据段、堆栈等。
要创建一个新的进程,可以使用fork()
函数。fork()
函数会创建一个与父进程几乎完全相同的子进程。子进程会从父进程继承大部分环境,但是也可以使用exec()
函数来替换当前进程的内存空间,加载并执行另一个程序。
下面是一个简单的示例,展示了如何使用fork()
和exec()
函数创建一个新进程:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
pid_t pid = fork();
if (pid == -1) {
// 错误处理
perror("fork failed");
return 1;
} else if (pid == 0) {
// 子进程
printf("子进程 PID: %d\n", getpid());
// 用 execlp 替换当前进程,执行新的程序
execlp("/bin/ls", "ls", (char*)NULL);
// 如果exec函数返回,表示执行失败
perror("execlp failed");
return 2;
} else {
// 父进程
printf("父进程 PID: %d, 子进程 PID: %d\n", getpid(), pid);
// 父进程等待子进程结束
wait(NULL);
}
return 0;
}
这段代码首先调用fork()
创建一个子进程。如果fork()
返回-1,表示创建失败;如果返回0,表示当前在子进程中;如果返回非0值,表示当前在父进程中,返回值是子进程的PID。在子进程中,我们使用getpid()
获取当前进程的PID,然后使用execlp()
加载并执行ls
命令来列出当前目录下的文件。在父进程中,我们等待子进程结束后才退出程序。
评论已关闭