我无法让execv()在我的C程序中工作。我怀疑问题出在这一部分,这与char * args [10]有关。以下是细分:
void mySystem(char *str, int *num_f, int *sig_k) {
int pid, stat;
if ( fork() == 0) {
char * args[10];
args[0] = str;
args[1] = NULL;
execv(str, &args);
exit(20);
这会发出警告:
systest.c:17: warning: passing argument 2 of âexecvâ from incompatible pointer type
我已经工作了好几个小时,似乎尝试了一切。到底是怎么回事?以下是所有代码,仅供参考,因为我发出了一个无关的错误:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
void mySystem(char *str, int *num_f, int *sig_k) {
int pid, stat;
if ( fork() == 0) {
char * args[10];
args[0] = str;
args[1] = NULL;
execv(str, &args);
exit(20);
}
pid = wait(&stat);
if (WEXITSTATUS(stat) != 0) {
printf("command %s failed (exit code %d)\n", str, WEXITSTATUS(stat));
} else {
printf("command %s success (exit code 0)\n", str);
num_f += 1;
printf("wat %d\n", num_f);
}
} //mySystem
int main() {
char buf[100];
char cmd[100];
int num_fails = 0, sig_kills = 0;
while(fgets(buf, 100, stdin)){
sscanf(buf, "%s", cmd);
if (strcmp(cmd, "quit") == 0) {
printf("ran with %s\n", cmd);
printf("num success = %d\n",num_fails);
exit(0); //returns 0 if equal, 1 if not
}
printf("in main %s\n", cmd);
mySystem(cmd, &num_fails, &sig_kills);
}
return 0;
}
运行时,所有命令都会失败。非常感谢任何帮助。
答案 0 :(得分:2)
您将execv的char * * *作为第二个参数传递,而它接受char **。您不需要addressof(&amp;)运算符,因为数组只能通过引用传递,而不能通过值传递。所以你想要:
execv(str, args);
而不是
execv(str, &args);
答案 1 :(得分:1)
execv
想要的是char *[]
,即指针数组,这是您使用args
定义的内容。
如果将&
添加到args
,则会得到类型char *(*[])
,这是指针数组的指针。跳过&
来电中的execv
,它一切正常。