Linux手账—exec和fork

打印 上一主题 下一主题

主题 783|帖子 783|积分 2349


   盼望你开心,盼望你健康,盼望你幸福,盼望你点赞!
  末了的末了,关注喵,关注喵,关注喵,大大会看到更多风趣的博客哦!!!
  喵喵喵,你对我真的很紧张!
  
前言

   在操纵体系中,进程控制和程序实行是焦点功能。fork 和 exec 系列函数为此提供了强大的工具。fork 用于创建一个新进程(子进程),而 exec 系列函数则用于在当前进程中实行新程序,替换其代码段。本文旨在简要介绍这两个函数的根本概念、用途和工作原理。
  
evec

包含的头文件

#include <unistd.h>:这个头文件包含了POSIX操纵体系API的函数原型,如文件操纵、进程控制、目次操纵等。在这里,它主要是为了使用exec系列的函数。

外部变量

extern char **environ;:这行代码声明白一个外部变量environ,它是一个指向字符指针数组的指针。这个数组包含了当前进程的情况变量,每个元素都是一个指向以null末端的字符串的指针。这个数组以NULL末端。

函数原型

代码中列出了多个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[]);
int execve(const char *filename, char *const argv[], char *const envp[]);
exel应为execl。
exele应为execle,且参数列表中的逗号使用有误,应去掉多余的逗号。
execv和execvp的函数原型在图片中根本精确,但execvp的参数列表中的逗号位置不影响其意义,只是格式上的小瑕疵。
execvpe和execve的函数原型在图片中同样存在格式上的标题,主要是多余的逗号,但焦点意思精确。

NULL指针

代码中提到了NULL,但在给出的文本中,NULL被误写为NOLL。在C语言中,NULL用于表现空指针。

函数功能

这些exec系列的函数都用于在当前进程中实行一个新的程序。它们会替换当前进程的地点空间(代码、数据、堆栈等)为新程序的地点空间。
不同的exec函数提供了不同的方式来指定要实行的程序、通报命令行参数以及设置情况变量。

   int execl(const char *path, const char *arg, ...);
  execl函数使用给定的路径名path来实行一个程序。
  第二个参数arg是通报给新程序的第一个命令行参数(通常是程序的名称)。
  后续参数是可变数目的命令行参数,列表必须以NULL末端。
  
   int execlp(const char *file, const char *arg, ...);
  execlp函数雷同于execl,但它使用PATH情况变量来查找要实行的程序。
  file参数是程序名,而不是路径名。
  其余参数与execl雷同。
  
   int execle(const char *path, const char *arg, ..., char *const envp[]);
  execle函数与execl雷同,但它答应用户指定一个新的情况变量数组envp。
  envp是一个以NULL末端的字符指针数组,每个元素都是一个指向情况变量的指针。
  其余参数与execl雷同。
  
   int execv(const char *path, char *const argv[]);
  execv函数使用给定的路径名path来实行一个程序。
  argv是一个指向以NULL末端的字符指针数组的指针,该数组包含要通报给新程序的命令行参数。
  argv[0]通常是程序的名称。
  
   int execvp(const char *file, char *const argv[]);
  execvp函数雷同于execv,但它使用PATH情况变量来查找要实行的程序。
  file参数是程序名,而不是路径名。
  argv参数与execv雷同。
  
   int execvpe(const char *file, char *const argv[], char *const envp[]);
  execvpe函数联合了execvp和execle的特点。
  它使用PATH情况变量来查找要实行的程序,并答应用户指定一个新的情况变量数组envp。
  file和argv参数与execvp雷同,envp参数与execle雷同。
  
   int execve(const char *filename, char *const argv[], char *const envp[]);
  execve函数是最通用和最强大的exec函数。
  它答应用户直接指定要实行的文件的名称filename、命令行参数数组argv和情况变量数组envp。
  filename可以是绝对路径或相对路径。
  
fork

fork是Linux体系中的一个非常紧张的体系调用,它用于创建一个新的进程。以下是关于fork命令的详细分析:
一、fork的根本功能

fork函数通过体系调用创建一个与原来进程险些完全雷同的进程,新创建的进程被称为子进程,而原进程被称为父进程。子进程会继续父进程的资源,包罗代码、数据、堆栈、文件形貌符、内存映射、信号处置惩罚等,但每个进程都会拥有本身独立的地点空间和堆栈。
二、fork的返回值



  • 在父进程中,fork函数返回新创建的子进程的进程ID(PID)。
  • 在子进程中,fork函数返回0。
  • 如果创建进程失败,fork函数返回-1,并设置相应的errno值以指示错误类型。
三、fork的实行流程


  • 当调用fork函数时,操纵体系会为新的子进程分配资源,包罗存储数据和代码的空间。
  • 操纵体系会把父进程的全部值都复制到新的子进程中,但某些值(如进程ID、父进程ID、返回地点等)在子进程中会被设置为新的值。
  • fork函数会返回两次:一次在父进程中返回子进程的PID,一次在子进程中返回0。因此,在调用fork函数后,需要判断返回值以确定当前是在父进程还是子进程中。
四、fork后的进程状态


  • 父进程和子进程是并发实行的,它们的实行顺序是不确定的,这取决于操纵体系的进程调理计谋。
  • 父进程和子进程之间的内存空间是独立的,它们不能直接共享变量和数据。如果需要在父子进程之间共享数据,可以使用共享内存、管道、消息队列等进程间通讯(IPC)机制。
  • 子进程会继续父进程的文件锁、信号处置惩罚器等状态,但也可以独立地修改这些状态。

总结

简而言之,fork 函数用于创建一个新进程,该进程是调用进程的副本(子进程)。子进程会继续父进程的资源,但拥有独立的地点空间和堆栈。而 exec 系列函数则用于在当前进程中实行新程序,替换其地点空间。这些函数为开发者提供了进程控制和程序实行的机动性。通过 fork 和 exec,开发者可以实现多进程编程,进步程序的并发性和响应速度。同时,需要注意这些函数的返回值和实行流程,以及进程间的独立性和通讯机制。

   盼望你开心,盼望你健康,盼望你幸福,盼望你点赞!
  末了的末了,关注喵,关注喵,关注喵,大大会看到更多风趣的博客哦!!!
  喵喵喵,你对我真的很紧张!
  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表