exec函数族
fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支)子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替代,从心程序的启动例程开始执行。调用exec并不是创建新进程,所以调用exec前后该进程id并未改变
execlp函数
加载一个进程 借助PATH环境变量
int execlp(cosnt char* file, const char* arg,……); 成功:无返回 失败:-1
参数1:要加载的程序的名字。该函数需要配合PATH环境变量来使用,当PATH中所有目录搜索后没有参数1则出错返回。
该函数通常用来调用系统程序。如:ls、date、cp、cat等命令
execlp实现子进程中执行ls -l -a
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void){
pid_t pid;
pid = fork();
if(pid == -1){
perror("fork error");
exit(1);
}else if(pid > 0){
sleep(1);
printf("parent\n");
}else{
execlp("ls","ls","-l","-a",NULL);
}
return 0;
}
execl函数
加载一个进程 通过 路径+程序名 来加载
int execl(const char* path, const char* arg,……); 成功:无返回 失败:-1
对比execlp 如加载“ls”命令带有-l -F参数
execl("/bin/ls","ls","-l","-F",NULL);
使用execl实现
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void){
pid_t pid;
pid = fork();
if(pid == -1){
perror("fork error");
exit(1);
}else if(pid > 0){
sleep(1);
printf("parent\n");
}else{
execl("bin/ls","ls","-l","-a",NULL);
}
return 0;
}
execvp函数
加载一个进程 使用自定义环境变量env
int execvp(const char* file,const char* argv[]);
dup2
把进程信息打印到文件中
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
int main(void){
int fd;