编译执行过程中没有报错,从结果来看,符合预期(当中有如预期一样的停顿,并且执行的先后顺序符合期望)
在头文件中,我们通过层层追溯的方式可以找到一个类型的定义
这里我们来看看 exec 究竟是什么
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
文件中
/* 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
将所有参数整体构造指针数组传递在 unistd.h 中包含 fork,sleep,getpid,getppid
的函数原型
/* 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;
在 unistd.h 中包含 fork,vfork
的函数原型
/* 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 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
头文件中有如下定义
/* 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))
以下这些函数可以进行进程创建和简单的管理
通过各方面资料弄懂其参数的意义和返回值的类型,是熟练掌握的基础
原文地址
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。