Wait()函数导致分段错误(核心已转储)

时间:2018-11-10 13:06:23

标签: c fork wait

运行此代码时,出现“分段错误(内核已转储)”。 显然,它来自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 :(得分:1)

代码中第一个未定义行为的实例是

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"))
{
    ...
}