C中fork()和exec()之间的区别是什么?fork()和exec()的简单比较
时间:2019-04-01 15:02
每一个应用(程序)都是通过进程的方式来执行的,进程是一个正在运行的程序实例。进程是通过不同的系统调用创建的,最流行的是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语言教程》
以上就是本篇文章的全部内容,希望能对大家的学习有所帮助。更多精彩内容大家可以关注gxlsystem.com相关教程栏目!!!
以上就是C中fork()和exec()之间的区别是什么?fork()和exec()的简单比较的详细内容,更多请关注gxlsystem.com其它相关文章!