2012-01-20 4 views
0

私のCプログラムでexecv()を動作させることができません。私はこの問題がこのセグメントにあると考えています。これはchar * args [10]と関係があります。ここではセグメントがある:私は時間のために働いて、一見すべてを試みてきたC execv()パラメータの問題

systest.c:17: warning: passing argument 2 of âexecvâ from incompatible pointer type 

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); 

これは、警告を与えます。何が起こっている?ここにすべてのコードがありますが、私は無関係のエラーを作り出しています。

#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; 

} 

実行時にすべてのコマンドが失敗するだけです。どんな助けでも大歓迎です。

答えて

1

execv欲求は、あなたがargsと定義するものであるポインタの配列、すなわち、char *[]です。

args&を追加すると、ポインタの配列へのポインタであるタイプchar *(*[])が得られます。 execvコールで&をスキップすると、すべて動作します。

+0

申し分ありません。私がプログラムを走らせた後、 '&'すべてのコマンドを取り除いても、私は終了コード20を与えています。 'exit(20)'行を実行しないでください。 'execv'がプロセスを終了させるので? – dubyaa

+1

@dubyaa 'execv'関数は実際には失敗するかもしれません。それが-1を返すかどうかをチェックし、何がうまくいかなかったかについて 'errno'をチェックしてください。 –

2

2番目のパラメータとしてexecvにchar * *を渡していますが、char **を受け入れます。配列は値ではなく参照のみで渡せるため、addressof(&)演算子は必要ありません。だから、欲しい:

execv(str, args); 

代わりの

execv(str, &args);