Функция Wait () делает ошибку сегментации (ядро сброшено) - PullRequest
0 голосов
/ 10 ноября 2018

Когда я запускаю этот код, у меня появляется «Ошибка сегментации (ядро сброшено)». Очевидно это происходит из секции wait (), но я не могу понять это.

int main(int argc, char** argv)

{   
pid_t pid, pid2;
int etat;
char** entree_util;
entree_util[0]="none";
char * accueil = "Veuillez entrer votre commande\n";
while (entree_util[0]!="^D")
{
    write(1,accueil, strlen(accueil)*sizeof(char) );
    entree_util=lis_ligne();
    pid=fork();
    if(pid==-1)
    {
        perror("Erreur à l'appel de fork\n");
        exit(-1);
    }
    else if(pid==0)
    {
    execv(entree_util[0],entree_util+1);
    }
    else
    {
         pid2 = wait(&etat);
    }
}
return 0;   
}

1 Ответ

0 голосов
/ 10 ноября 2018

Первый случай неопределенного поведения в вашем коде -

char** entree_util;
entree_util[0]="none";

entree_util - неинициализированный указатель.

Вам, вероятно, следует изменить структуру вашего цикла:

char** entree_util;

while (1)
{
    write(1, accueil, strlen(accueil));  // note: sizeof (char) is 1 by definition
    entree_util = lis_ligne();
    if (we_are_finished(entree_util)) {
        break;
    }
    ...
}

Обратите внимание, что entree_util[0] != "^D" не имеет смысла как условие; вы не сравниваете строки здесь, вы сравниваете указатели. Правильное условие зависит от того, что возвращает lis_ligne, что вы не показали.

В качестве альтернативы вы можете переместить логику для запроса пользователя и чтения строки в отдельную вспомогательную функцию:

char **lis_ligne_avec_invite_de_commande(const char *accueil) {
    write(1, accueil, strlen(accueil));
    return lis_ligne();
}

, а затем используйте его так:

char** entree_util;
while (!we_are_finished(entree_util = lis_ligne_avec_invite_de_commande("Veuillez entrer votre commande\n"))
{
    ...
}
...