C execv()参数问题

C execv()参数问题,c,operating-system,C,Operating System,我无法使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); ex

我无法使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;

}
#包括
#包括
#包括
#包括
#包括
void mySystem(char*str,int*num\u f,int*sig\u k){
int-pid,stat;
如果(fork()==0){
char*args[10];
args[0]=str;
args[1]=NULL;
execv(str和args);
出口(20);
}
pid=等待(&stat);
如果(WEXITSTATUS(stat)!=0){
printf(“命令%s失败(退出代码%d)\n”,str,WEXITSTATUS(stat));
}否则{
printf(“命令%s成功(退出代码0)\n”,str);
num_f+=1;
printf(“wat%d\n”,num\u f);
}
}//我的系统
int main(){
char-buf[100];
char-cmd[100];
int num_failes=0,sig_kills=0;
而(fgets(buf、100、stdin)){
sscanf(buf,“%s”,cmd);
如果(strcmp(cmd,“quit”)==0){
printf(“与%s\n一起运行”,cmd);
printf(“num success=%d\n”,num\u失败);
退出(0);//如果相等,则返回0;如果不相等,则返回1
}
printf(“主%s\n”,cmd);
mySystem(cmd、num_失败、sig_终止);
} 
返回0;
}

运行时,所有命令都会失败。非常感谢您的帮助。

您正在为execv传递一个字符***作为第二个参数,而它接受一个字符**。您不需要addressof(&)运算符,因为数组只能通过引用传递,不能通过值传递。所以你想要:

execv(str, args);
而不是

execv(str, &args);

您正在为execv传递一个char***作为第二个参数,而它接受一个char**。您不需要addressof(&)运算符,因为数组只能通过引用传递,不能通过值传递。所以你想要:

execv(str, args);
而不是

execv(str, &args);

execv
想要的是一个
char*[]
,即一个指针数组,这是您用
args
定义的


如果将
&
添加到
args
中,则会得到类型
char*(*[])
,即指向指针数组的指针。跳过
execv
调用中的
&
,它将全部工作。

execv
需要的是一个
char*[]
,即一个指针数组,这是您用
args
定义的


如果将
&
添加到
args
中,则会得到类型
char*(*[])
,即指向指针数组的指针。跳过
execv
调用中的
,它将全部工作。

好的,这是有意义的。如果您不介意这里还有一个问题的话,在我运行程序之后,通过删除
&
我键入的每个命令仍然会给出退出代码20。
exit(20)
行不应该运行吗,因为
execv
会终止进程?@dubyaa
execv
功能实际上可能会失败。检查它是否返回-1,然后检查出错的原因。好的,这是有意义的。如果您不介意这里还有一个问题的话,在我运行程序之后,通过删除
&
我键入的每个命令仍然会给出退出代码20。
exit(20)
行不应该运行吗,因为
execv
会终止进程?@dubyaa
execv
功能实际上可能会失败。检查它是否返回-1,然后检查出错的原因。