Day29
创建子进程
exec函数创建一个新进程,用自己的全部地址空间覆盖调用进程的地址空间,但进程的PID不变
exec是一个变身函数集合
#include <unistd.h>
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 execve(const char* path, char* const argv[],char* const envp[]);
参数:
path 字符串首地址,存储可执行程序的路径
file 字符串首地址,存储可执行程序文件名,函数会从环境变量中寻找对应可执行文件
const char* arg,... 可变长命令行参数,用一个或多个字符串首地址形式表达,以空指针结束
char* const argv[] 命令行参数,用字符串数组形式存储表达,以空指针结束
char* const envp[] 为新进程配置的环境参数,用字符串数组形式存储表达,以空指针结束,不指明环境变量则从调用进程复制
返回值:成功不返回,失败返回-1
⭐其他五个函数都是对execve的包装
新进程的创建就是先用fork函数创建子进程,子进程再用exec函数变成一个新进程
旧进程的东西大部分被丢弃,但也有一些属性被新进程继承,比如PID、PPID、实际用户ID、实际组ID、优先级、文件描述符
执行shell命令
#include <stdlib.h>
int system(const char* command);
功能:执行shell命令
参数:commmand shell命令行字符串
返回值:成功返回command进程的终止状态,失败返回-1
⭐若command取NULL,返回非0表示shell可用,返回0表示shell不可用
⭐system函数调用了vfork、exec、waitpid(vfork和fork的区别在于vfork不复制副本而是先共用一块表,但此时父进程不能使用,当子进程有了自己的表,再还给父进程)