1.O_EXCL
作用:
2. exec
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
int execle(const char *path, const char *arg0, ... /*,(char *)0, char *const envp[]*/);
int execlp(const char *file, const char *arg0, ... /*, (char *)0 */);
int execv(const char *path, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);
进程的 image = 进程的组成部分(text|data|bss|堆栈)
int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
int execv(const char *path, char *const argv[]);
功能:
执行一个新的程序
l 和 v
list //列举 --- 后面的参数逐个列举出来
vector //向量 --- 后面的参数 以字符串指针数组的形式组织
参数:
@path //说明 --要执行的可执行文件的名字 (包含路径)
@arg0 //执行文件的名字
... //可变参数
//看要执行的文件 是否有需要的参数
//形式 字符串形式 最终 以 NULL作为结尾
eg:
ls //系统提供的命令 本质 是一个可执行文件
//which 命令名 ---查看命令在系统中位置
ls -l /
execl("/bin/ls","ls","-l","/",NULL);
char *const arg[] = {"ls","-l","/",NULL};
execv("/bin/ls",arg);
bash
|
fork()
/ \
bash bash (+exec 函数调用 --- 它会用新程序的镜像替换原有镜像,
名字也变了,父子关系没变)
int execle(const char *path, const char *arg0, ... /*,(char *)0, char *const envp[]*/);
int execve(const char *path, char *const argv[], char *const envp[]);
e --- environment
应用:
有些程序 ,运行时,需要获得环境变量 (系统的 或者 自定义)
3.strtok()
char *strtok(char *str, const char *delim);
功能:
分割字符串
参数:
str 表示要分割的字符串 //如果填写NULL 表示接着原来的字符串继续分割
delim 表示分割标志
返回值:
成功 返回分割出来的字符串地址
失败 返回NULL
char *arg[] = {"ls","-l","/",NULL};
execvp(arg[0],arg);
创建 -fork
执行
复制父进程
执行一个新程序
退出
4.wait() //
pid_t wait(int *wstatus);
功能:
等待子进程状态改变
(主要用来 --- 回收子进程的资源----避免僵尸态)
参数:
wstatus NULL //表示不关心子进程退出时 状态信息
不是NULL //想关心子进程退出状态信息
返回值:
成功 返回结束了的子进程的pid号
失败 -1
说明:
1.wait ---阻塞操作
2.如果没有任何子进程,wait调用失败 --提示 NO child process