Проблема с C execv () - PullRequest
       2

Проблема с C execv ()

0 голосов
/ 20 января 2012

Я не могу заставить 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;

}

При запуске все команды просто терпят неудачу.Любая помощь с благодарностью.

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Вы передаете символ * * * для execv в качестве второго параметра, в то время как он принимает символ **. Вам не нужен оператор addressof (&), так как массив может быть передан только по ссылке, а не по значению. Итак, вы хотите:

execv(str, args);

вместо

execv(str, &args);
1 голос
/ 20 января 2012

То, что execv хочет, это char *[], то есть массив указателей, который вы определяете с помощью args.

Если вы добавите & к args, вы получитевведите char *(*[]), то есть указатель на массив указателей.Пропустите & в вызове execv, и все будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...