exec函数有六个但是实际上掌握好一个自己熟悉的就好了,因为他们作用都是一样的,我在这里最喜欢用的是execv,所以就只讨论这个函数的用法。
期间代码要和fork交相使用,fork有两个返回值,父进程返回子进程的pid,子进程返回0,因为子进程可以用getppid()知道父进程的pid(父进程唯一是这个理论的支持),而父进程可以拥有多个子进程,所以无法用函数去单纯获得子进程pid。
函数原型
#include <unistd.h>
int exevc(const char *pathname,char *const argv[]);
关于argv里面的参数,之前我一直有所疑惑,先用一个简单的代码看看如果这样写里面会有什么::
#include <unistd.h>
#include <stdio.h>
int main(int argc,char* argv[])
{
printf("argv[0]::%s\n",argv[0]);
printf("argv[1]::%s\n",argv[1]);
printf("argv[2]::%s\n",argv[2]);
execv("/bin/ls",argv);
return 0;
}
运行结果和使用方法::
截图有点不清晰但是不影响观看,可以看出argv的结尾一定是空指针,而里面存放的就是命令要调用的参数。
以下是我对第二个参数进行的测试:
#include <unistd.h>
#include <stdio.h>
int main(int argc,char* argv[])
{
char *my[3] = {0};
my[0] = "nihao";
my[1] = "-l";
//my[2]空指针
execv("/bin/ls",my);
return 0;
}
运行结果:
可见运行结果并没有受到影响,所以可以得出结论
关于execv的第二个参数数组,他的第一个位置存放的东西对于程序没有影响(但是应该存应用程序名字本身,可是我发现里面不管放什么都不影响程序结果所以得出这个结论,因为我不知道它放程序名字的意义何在),但是第二个及第二个以后存放的就是她应该使用的参数,最终结尾是空指针。