在使用exec
系列函数时,execle
,execv
,execvp
三个函数,都可以使用char *arg[]
传入启动参数。以下面的程序为例,
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int ret;
char *argv[] = {"ls","-l",NULL};
ret = execvp("ls",argv);
if(ret == -1)
perror("execl error");
return 0;
}
编译时就会出现一下,警告,
expected 'char * const*' but argument is of type 'const char **'
因为项目中不允许警告产生,所以编译选项是-Werror
,所有警告都会被升级成错误。编译时就会产生如下提示,
ccl : all warnings being treated as errors
如果是平时练习,改一下编译选项,把这个警告忽略就行,但是现在只能解决。
出现这个问题就是因为定义数组时char *argv[]
类型是char **
。但是execvp()
函数签名是execvp(const char *file, char *const argv[]);
第二个参数的类型是char * const *
。
本以为直接将变量定义更改成char * const argv[]
就行了,但是它等价于const char **
,所以仍然不能和函数签名匹配。
实在没办法只能改成如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
printf("entering main process---\n");
int ret;
char str1[] = "ls";
char str2[] = "-l";
char * const argv[] = {str1, str2, NULL};
ret = execvp("ls",argv);
if(ret == -1)
perror("execl error");
printf("exiting main process ----\n");
return 0;
}
或者在将形参argv
进行强制转换。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
printf("entering main process---\n");
int ret;
char const *argv[] = {"ls", "-l", NULL};
ret = execvp("ls",(char * const *)argv);
if(ret == -1)
perror("execl error");
printf("exiting main process ----\n");
return 0;
}