1.创建ps命令-execl的使用
exec系列单独是能使用的,但是没有多大意义.通常我们会结合fork一起使用;
fork+exec()是Linux上创建新进程的方式;
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<wait.h>
int main()
{
printf("main pid=%d,ppid=%d\n",getpid(),getppid());
pid_t pid=fork();
assert(pid!=-1);
if(pid==0)
{
printf("child pid=%d,ppid=%d\n",getpid(),getppid());
// execl("/bin/ps","-f",(char *)0);//省略了ps也对,但是最好写成上面的;
execl("/usr/bin/ps","ps","-f",NULL);
printf("execl error");
exit(0);
}
wait(NULL);
exit(0);
}
比如我们在子进程退出前:
printf("child end!\n");
我们发现执行不到这一句,因为去执行ps去了,然后从ps退出进程了,除非execl执行失败.
2.fork和exec联合使用创建一个全新的进程
当前主程序main通过fork复制产生一个子进程,子进程用新程序"newmain"替换自身; (newmain:打印参数内容和环境变量)
//main.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <wait.h>
int main(int argc,char *argv[],char *envp[])
{
printf("main pid=%d\n",getpid());
pid_t pid=fork();
assert(pid!=-1);
if(pid==0)
{
char *myargv[]={"newmain","hello","abc","123",(char *)0};
//char *myenvp[]={"MYSTR=hello","VAL=100",(char *)0};
execve("./newmain",myargv,envp);
perror("execl error");
exit(0);
}
wait(NULL);
printf("main over\n");
exit(0);
}
//newmain.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[],char *envp[])
{
printf("newmain pid=%d\n",getpid());
int i=0;
printf("argc=%d\n",argc);
for(;i<argc;i++)
{
printf("argv[%d]=%s\n",i,argv[i]);
}
for(i=0;envp[i]!=NULL;i++)
{
printf("envp[%d]=%s\n",i,envp[i]);
}
exit(0);
}