前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >进程 (二).exec(2)

进程 (二).exec(2)

作者头像
franket
发布2021-09-16 09:43:28
5190
发布2021-09-16 09:43:28
举报
文章被收录于专栏:技术杂记技术杂记

编译执行过程中没有报错,从结果来看,符合预期(当中有如预期一样的停顿,并且执行的先后顺序符合期望)


exec函数族

在头文件中,我们通过层层追溯的方式可以找到一个类型的定义

这里我们来看看 exec 究竟是什么

代码语言:javascript
复制
root@ubuntu:/usr/include# grep int unistd.h  | grep exec 
extern int execve (__const char *__path, char *__const __argv[],
extern int fexecve (int __fd, char *__const __argv[], char *__const __envp[])
extern int execv (__const char *__path, char *__const __argv[])
extern int execle (__const char *__path, __const char *__arg, ...)
extern int execl (__const char *__path, __const char *__arg, ...)
extern int execvp (__const char *__file, char *__const __argv[])
extern int execlp (__const char *__file, __const char *__arg, ...)
extern int execvpe (__const char *__file, char *__const __argv[],
root@ubuntu:/usr/include#

从中随便挑出几个来看

unistd.h 文件中

代码语言:javascript
复制
/* Execute PATH with arguments ARGV and environment from `environ'.  */
extern int execv (__const char *__path, char *__const __argv[])
     __THROW __nonnull ((1));

/* Execute PATH with all arguments after PATH until a NULL pointer,
   and the argument after that for environment.  */
extern int execle (__const char *__path, __const char *__arg, ...)
     __THROW __nonnull ((1));

/* Execute PATH with all arguments after PATH until
   a NULL pointer and environment from `environ'.  */
extern int execl (__const char *__path, __const char *__arg, ...)
     __THROW __nonnull ((1));

/* Execute FILE, searching in the `PATH' environment variable if it contains
   no slashes, with arguments ARGV and environment from `environ'.  */
extern int execvp (__const char *__file, char *__const __argv[])
     __THROW __nonnull ((1));

大体上分三类:

  • e 可以使用系统默认的环境变量
  • p 可以使用系统PATH路径中的程序
  • l 逐个参数列举
  • v 将所有参数整体构造指针数组传递

fork,sleep,getpid,getppid 原型

unistd.h 中包含 fork,sleep,getpid,getppid 的函数原型

代码语言:javascript
复制
/* Clone the calling process, creating an exact copy.
   Return -1 for errors, 0 to the new process,
   and the process ID of the new process to the old process.  */
extern __pid_t fork (void) __THROW;
/* Make the process sleep for SECONDS seconds, or until a signal arrives
   and is not ignored.  The function returns the number of seconds less
   than SECONDS which it actually slept (thus zero if it slept the full time).
   If a signal handler does a `longjmp' or modifies the handling of the
   SIGALRM signal while inside `sleep' call, the handling of the SIGALRM
   signal afterwards is undefined.  There is no return value to indicate
   error, but if `sleep' returns SECONDS, it probably didn't work.

   This function is a cancellation point and therefore not marked with
   __THROW.  */
extern unsigned int sleep (unsigned int __seconds);
/* Get the process ID of the calling process.  */
extern __pid_t getpid (void) __THROW;

/* Get the process ID of the calling process's parent.  */
extern __pid_t getppid (void) __THROW;

fork 和 vfork

unistd.h 中包含 fork,vfork 的函数原型

代码语言:javascript
复制
/* Clone the calling process, creating an exact copy.
   Return -1 for errors, 0 to the new process,
   and the process ID of the new process to the old process.  */
extern __pid_t fork (void) __THROW;
/* Clone the calling process, but without copying the whole address space.
   The calling process is suspended until the new process exits or is
   replaced by a call to `execve'.  Return -1 for errors, 0 to the new process,
   and the process ID of the new process to the old process.  */
extern __pid_t vfork (void) __THROW;

它们都是克隆一份主调进程,如果成功就返回子进程的进程ID给父进程,返回0给子进程,出错就返回-1

区别是在内存中vfork是进行COW(写时复制)的,fork是全部拷贝,因此vfork速度会更快,更省空间


wait,waitpid

代码语言:javascript
复制
/* Wait for a child to die.  When one does, put its status in *STAT_LOC
   and return its process ID.  For errors, return (pid_t) -1.

   This function is a cancellation point and therefore not marked with
   __THROW.  */
extern __pid_t wait (__WAIT_STATUS __stat_loc);
/* Wait for a child matching PID to die.
   If PID is greater than 0, match any process whose process ID is PID.
   If PID is (pid_t) -1, match any process.
   If PID is (pid_t) 0, match any process with the
   same process group as the current process.
   If PID is less than -1, match any process whose
   process group is the absolute value of PID.
   If the WNOHANG bit is set in OPTIONS, and that child
   is not already dead, return (pid_t) 0.  If successful,
   return PID and store the dead child's status in STAT_LOC.
   Return (pid_t) -1 for errors.  If the WUNTRACED bit is
   set in OPTIONS, return status for stopped children; otherwise don't.

   This function is a cancellation point and therefore not marked with
   __THROW.  */
extern __pid_t waitpid (__pid_t __pid, int *__stat_loc, int __options);

从上面的描述可以知道

wait(&status) 相当于 waitpid(-1,&status,0)

实际上Linux 内部在实现wait函数时直接调用的就是waitpid函数

status 是用来存放返回值的,一般不是直接使用,而是通过宏来进行解析,例如 WEXITSTATUS(status)

stdlib.h 头文件中有如下定义

代码语言:javascript
复制
/* Define the macros <sys/wait.h> also would define this way.  */
# define WEXITSTATUS(status)    __WEXITSTATUS (__WAIT_INT (status))
# define WTERMSIG(status)       __WTERMSIG (__WAIT_INT (status))
# define WSTOPSIG(status)       __WSTOPSIG (__WAIT_INT (status))
# define WIFEXITED(status)      __WIFEXITED (__WAIT_INT (status))
# define WIFSIGNALED(status)    __WIFSIGNALED (__WAIT_INT (status))
# define WIFSTOPPED(status)     __WIFSTOPPED (__WAIT_INT (status))

总结

以下这些函数可以进行进程创建和简单的管理

  • fork
  • waitpid/wait
  • exec*

通过各方面资料弄懂其参数的意义和返回值的类型,是熟练掌握的基础

原文地址

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • exec函数族
  • fork,sleep,getpid,getppid 原型
  • fork 和 vfork
  • wait,waitpid
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档