fork()
和exec()
的区别
在Linux系统中,fork()
和exec()
是两个常用的系统调用,它们都与进程有关。但是它们的用途是不同的,这里详细讲解两者的区别。
fork()
fork()
的作用是创建一个新的进程,新进程是原进程的副本,这个新进程被称为子进程。子进程具有与父进程(即原进程)完全相同的代码和数据,但是其运行状态和内存空间都是独立的,即父子进程之间不共享内存空间。
下面是一个简单的示例,展示了fork()
的基本使用方法:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main() {
pid_t pid;
int x = 1;
pid = fork();
if (pid == 0) {
x++;
printf("x in child process: %d\n", x); // 子进程中的 x
}
else {
x--;
printf("x in parent process: %d\n", x); // 父进程中的 x
}
return 0;
}
输出如下:
x in child process: 2
x in parent process: 0
在示例中,fork()
创建了一个子进程。子进程执行了x++
操作,x
的值变为了2,而在父进程中x--
操作使得x
的值变为了0。
exec()
exec()
的作用是在当前进程中执行一个新的程序,取代当前进程的数据和代码。也就是说,exec()
调用之后,原来进程的代码和数据都被新的程序的代码和数据所取代。
下面是一个简单的示例,展示了exec()
的基本使用方法:
#include<unistd.h>
int main() {
char *argv[2];
argv[0] = "/bin/ls"; // 为 ls 命令的绝对路径
argv[1] = NULL; // 参数列表必须以 NULL 结束
execv("/bin/ls", argv);
return 0;
}
这个程序调用了execv()
函数,用/bin/ls
作为参数来执行ls
命令。执行该程序,将输出当前目录下的文件列表。
区别
fork()
和exec()
一般一起使用,而且是顺序执行。调用fork()
创建子进程后,一般立即调用exec()
加载新的程序运行。但fork()
和exec()
的区别在于它们的目的和作用不同:
fork()
的作用是创建一个新的进程,与父进程的代码和数据相同,但运行状态和内存空间互不干扰。exec()
的作用是在当前进程中执行新程序的代码和数据,原来的进程被新程序取代。
在"fork()"和"exec()"的典型用法中,父进程调用"fork()"创建一个子进程,然后父进程通过子进程中的"exec()"函数来加载一个新的进程映像,使子进程成为一个新进程,从而执行由父进程所指定的程序。下面给出一个例子:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#define MAXLINE 1024
int main()
{
char buf[MAXLINE];
pid_t pid;
int status;
printf("%% "); /* print prompt (printf requires %% to print %) */
while (fgets(buf, MAXLINE, stdin) != NULL) {
if (buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = '\0';
if ((pid = fork()) < 0) {
printf("fork error");
continue;
} else if (pid == 0) { /* child */
execlp(buf, buf, (char *) 0);
printf("couldn’t execute: %s", buf);
exit(127);
}
/* parent */
if ((pid = waitpid(pid, &status, 0)) < 0)
printf("waitpid error");
printf("%% ");
}
exit(0);
}
这个程序通过fgets读入命令行输入,调用fork()创建一个新进程,子进程中调用execlp()函数合适地加载新的程序并执行,父进程则等待新建子进程结束并给出shell提示。这里 exec()是与 fork()配合使用的常用方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:fork()和exec()的区别 - Python技术站