本文最后更新于:3 个月前
在使用exec
系列函数时,execle
,execv
,execvp
三个函数,都可以使用char *arg[]
传入启动参数。以下面的程序为例,
1 2 3 4 5 6 7 8 9 10 11 12 13
| #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; }
|
编译时就会出现一下,警告,
1
| expected 'char * const*' but argument is of type 'const char **'
|
因为项目中不允许警告产生,所以编译选项是-Werror
,所有警告都会被升级成错误。编译时就会产生如下提示,
1
| 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 **
,所以仍然不能和函数签名匹配。
实在没办法只能改成如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #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
进行强制转换。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #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; }
|