https://note.youdao.com/ynoteshare1/index.html?id=2d379469cae5626e134316632e1386b4&type=note
目录
一、exec族函数及实战
which ls 查找命令路径
exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。
可以直接把一个编译好的可执行程序直接加载运行。
使用exec族函数后,我们的父子进程是这样的:
子进程需要运行的程序被单独编写,生成一个a
主进程是父进程,fork创建子进程后在子进程中用exec来执行a,达到各自执行,同步运行
1、exec族函数包含如下函数:
#include <unistd.h>
extern char **environ;
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[]); |
2、函数使用示例:
总体:file.c
#include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { pid_t ret = -1; pid_t pid = -1; int status = -1; //
pid = fork(); //创建子进程,返回两个pid,一个是父进程pid=0,一个是子进程pid>0
if(pid == 0) { //子进程 printf("child ready\n"); printf("child pid = %d\n",getpid());
/*(1)使用execl和execlp分别运行ls -l -a*/ //execl("/bin/ls", "ls", "-l", "-a", NULL); //execl("exec", "aaa", "bbb", NULL); //execlp("ls", "ls", "-l", "-a", NULL); /*(2)使用execv和execvp运行ls*/ char *const ar |