execv的处理中有需要特别注意的东西,
下面是一个可以正常执行的例子
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
int ret = execv("/bin/ls", argv);
printf("ret = %d", ret);
return 0;
}
编译出来可执行程序test
./test
执行效果类似ls
./test -l
执行效果类似ls -l
另外,
printf("ret = %d", ret);
并没有打印出来
int main(int argc, char* argv[])
由于argv的第一个字符串是程序名称,所以,我们可以看出,execv的第二个参数对传入的字符串数组进行了处理,一定程度上忽略了第一个字符串
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
char* arg[] = {"aa", NULL};
int ret = execv("/bin/ls", arg);
printf("ret = %d", ret);
return 0;
}
这个程序是可以正确执行的。验证了上面的推断。
但是,我们发现,execv执行系统命令并不是简单的去拼接字符串
这个程序的execv执行会出错
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
char* arg[] = {"aa", " ", NULL};
int ret = execv("/bin/ls", arg);
printf("ret = %d", ret);
return 0;
}
这么写也会执行出错
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
char* arg[] = {"ls", " -l ", NULL};
int ret = execv("/bin/ls", arg);
printf("ret = %d", ret);
return 0;
}
多了空格就会导致出错,说明了execv的执行方式并不是处理拼接字符串的命令
这个需要特别注意。