Rumah  >  Artikel  >  pembangunan bahagian belakang  >  C中fork()和exec()之间的区别是什么?fork()和exec()的简单比较

C中fork()和exec()之间的区别是什么?fork()和exec()的简单比较

青灯夜游
青灯夜游asal
2019-04-01 15:02:006103semak imbas

每一个应用(程序)都是通过进程的方式来执行的,进程是一个正在运行的程序实例。进程是通过不同的系统调用创建的,最流行的是fork()和exec(),那么它们之间有什么区别?下面本篇文章就来给大家介绍一下fork()和exec()之间的区别,希望对大家有所帮助。

C中fork()和exec()之间的区别是什么?fork()和exec()的简单比较

C语言中的fork()

pid_t pid = fork();

fork()通过复制调用进程来创建一个新进程,产生了一个新的PID,新进程(称为子进程)是调用进程(称为父进程)的精确副本。两个进程几乎完全相同,除了以下情况:

 1、子进程具有自己的唯一进程ID,并且此PID与任何现有进程组的ID都不匹配。

 2、子进程的父进程ID与调用进程的ID相同。

 3、子级不继承其父级的内存锁和信号量调整。

 4、子级不从其父级继承未完成的异步I/O操作,也不从其父级继承任何异步I/O上下文。

fork()的返回值

fork()不接受任何参数并返回整数值。下面是fork()返回的不同值。

 ● 负值:创建子进程失败。

 ● 零:返回到新创建的子进程。

 ● 正值:返回父母或来电者。该值包含新创建的子进程的进程ID。

说明:一旦成功,子进程的PID将在父进程中返回,而将在子进程中返回0。失败时,在父进程中返回-1,不创建子进程,并适当设置errno。

C语言中的exec()

exec()函数系列将当前进程映像替换为新的进程映像。它将程序加载到当前进程空间,并从入口点运行它。

示例:我们已经在下面的C程序中实现了execv(),exec()系列由以下函数组成,

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);

fork()和exec()之间的区别

1、fork()创建启动一个新进程,该进程是调用它的进程的副本,两个进程完全相同;而exec()则用另一个(不相同的)进程映像替换当前进程映像,当前进程的“数据段”,“堆栈段”和“代码段”被新程序改写。

2、fork()创建一个新的进程就产生了一个新的PID,因此子进程拥有自己的进程ID。exec启动一个新程序,替换原有的进程,因此新程序会保持调用exec()进程的ID不变,即这个新的被exec执行的进程的PID不会改变,和调用exec函数的进程一样。

3、fork()之前父进程 打开的文件描述符,在子进程中同样打开,并且都指向相同的文件表项。 而,调用exec()之前打开的描述字会继续打开。

相关视频教程推荐:《C语言教程

以上就是本篇文章的全部内容,希望能对大家的学习有所帮助。更多精彩内容大家可以关注php中文网相关教程栏目!!!

Atas ialah kandungan terperinci C中fork()和exec()之间的区别是什么?fork()和exec()的简单比较. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn