每一个应用(程序)都是通过进程的方式来执行的,进程是一个正在运行的程序实例。进程是通过不同的系统调用创建的,最流行的是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语言教程》

更多相关文章

  1. c语言源程序的最小单位是什么
  2. c语言万年历程序代码
  3. c程序怎么编写x的y次方
  4. c语言程序是从源文件第一条语句开始执行的,这句话是错的吗
  5. c语言程序的调试方法
  6. c语言源程序文件的后缀是什么?
  7. c语言程序总是从第一个定义的函数开始执行吗?
  8. c语言规定在一个源程序中main函数的位置是哪里?
  9. c语言源程序经过编译后,生成文件的后缀是什么?

随机推荐

  1. 新一代Notebook神器出现,Jupyter危险了!
  2. 总结一些网站加密和混淆技术
  3. 爱了!安利一个相见恨晚的可视化学习网站
  4. 今天网站都变成灰色了,这其中是怎么实现的
  5. JavaScript 逆向爬取实战
  6. 用Echarts打造一个轮播图!
  7. 做动态图表,没有数据?用Python就能获取!
  8. 看完这篇文章,我彻底爱上了Python动态图表
  9. NBA投篮数据可视化,4行代码就能实现!
  10. Bong!5 款超牛逼的 Jupyter Notebook 插件