【问题标题】:Wait() function makes Segmentation fault (core dumped)Wait() 函数导致分段错误(核心转储)
【发布时间】:2018-11-10 13:06:23
【问题描述】:

当我运行此代码时,出现“分段错误(核心转储)”。 显然它来自 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;   
}

【问题讨论】:

  • 你的调试器说崩溃在哪里?
  • 你的编译器告诉你什么(我的意思是警告)
  • 那是因为你没有启用警告

标签: c fork wait


【解决方案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"))
{
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-23
    • 2022-01-02
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多