#include<wait.h>
#include<stdio.h>
#include<sys/types.h>
int main()
{
pid_t pid = fork();
int stat = 0;
printf("##pid:%d\n",pid);
switch(pid)
{
case -1:
perror("fork failed");
exit(1);
break;
case 0:
printf("\n");
execlp("ps","ps","au",NULL);
break;
default:
do
{
pid = waitpid(-1,&stat,WNOHANG);
if(pid==0)
{
printf("parent do something else.\n");
sleep(1);
}
}while(pid==0);
printf("Child has finished:PID=%d\n",pid);
printf("parent,ps done\n");
break;
}
exit(0);
}
执行的结果如下:
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[]);
path参数表示你要启动程序的名称包括路径名
arg参数表示启动程序所带的参数,一般第一个参数为要执行命令名,不是带路径且arg必须以NULL结束
带l 的exec函数:execl, execlp, execle,表示后边的参数以可变参数的形式给出且都以一个空指针结束。
带 p 的exec函数:execlp,execvp,表示第一个参数path不用输入完整路径,只有给出命令名即可,它会在环境变量PATH当中查找命令
不带 l 的exec函数:execv,execvp表示命令所需的参数以char *arg[]形式给出且arg最后一个元素必须
是NULL
带 e 的exec函数:execle表示,将环境变量传递给需要替换的进程
execlp("ps","ps", "au", 0);
注释:
execlp :
带l 的exec函数:execl, execlp, execle,表示后边的参数以可变参数的形式给出且都以一个空指针结束。
表示第一个参数path不用输入完整路径,只有给出命令名即可, 它会在环境变量PATH当中查找命令(execlp中的p代码 PATH)
arg参数表示启动程序所带的参数,一般第一个参数为要执行命令名,不是带路径且arg必须以NULL结束, execlp有四个参数,其中第二个,第三个为有效参数,最后一个0以NULL结尾
execl("/bin/ls","ls","-l",NULL);
注释:
带l 的exec函数:execl, execlp, execle,表示后边的参数以可变参数的形式给出且都以一个空指针结束.
path参数表示你要启动程序的名称包括路径名.
由于不带P,所有需要指定全路径: /bin/ls
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
printf("entering main process---\n");
int ret;
char *argv[] = {"ls","-l",NULL};
ret = execvp("ls",argv);
if(ret == -1)
perror("execl error");
printf("exiting main process ----\n");
return 0;
}
execvp:
注释:
不带 l 的exec函数:execv,execvp表示命令所需的参数以char *arg[]形式给出且arg最后一个元素必须
是NULL
p: 不用带路径,直接在path环境变量找
execle
带 e 的exec函数:execle表示,将环境变量传递给需要替换的进程
execle.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
char * const envp[] = {"AA=/use/bin", "BB=/opt/test", NULL};
printf("Entering main ...\n");
int ret;
//ret =execl("./hello", "hello", NULL);
ret =execle("./hello", "hello", NULL, envp);
if(ret == -1)
perror("execl error");
printf("Exiting main ...\n");
return 0;
}
hello.c
#include <unistd.h>
#include <stdio.h>
extern char** environ;
int main(void)
{
printf("hello pid=%d\n", getpid());
int i;
for (i=0; environ[i]!=NULL; ++i)
{
printf("%s\n", environ[i]);
}
return 0;
}
执行结果: