簡體   English   中英

fgets錯誤消息循環-C中的Linux shell

[英]fgets error message loop -Linux shell in C

嘗試構建linux shell時,除頂部出現此錯誤消息外,其他所有方法都工作正常!

我設置LINE = 81,它打印出錯誤消息的總長度/ LINE次。 我在尋找解決方法時遇到了麻煩。 我認為這是因為它不斷循環,並且因為它始終具有該條件,所以它將被打印出來。 我不希望它終止,只是刷新並繼續輸入,有什么想法嗎? 我需要提供錯誤消息。

編輯:添加'\\ n'時,其功能仍然相同。

char commands[LINE];

while (fgets(commands, LINE, stdin)!= NULL) {

    if (strlen(commands) >= LINE - 1) {
        printf("Too Many arguments please enter %d characters\n",LINE-2);
        continue;
    }

    childPID = fork();

    if (childPID < 0) {

        perror("fork");

        exit(-1);
    }
    if (childPID == 0) {
        parse(commands);
        exit(0);
    } else {
        if (waitpid(childPID, &status, 0) !=childPID) {
            perror("waitpid");
        } else
            if (!WIFEXITED(status)) {
                printf("Exited Abnormally\n");
            }

        putc('\n', stdout);
        fputs(PROMPT,stdout);

    }

    commands[0] = '\0';

 }
exit(0);
}

您應該在錯誤消息的末尾加上\\n

printf("Too Many arguments please enter %d characters\n",LINE-2);

stdout通常是行緩沖的,因此在您打印換行符之前不會刷新緩沖區。 當您的程序派生時,緩沖區將被復制到子進程中。 當子級調用exit() ,它將刷新其緩沖區的副本。 當父級調用putc('\\n')它將刷新其副本。 結果,該消息被打印兩次。

所以原來我需要遍歷然后打印並相應地移動提示

    while (fgets(commands, LINE, stdin)!= NULL) {

    if (strlen(commands) > LINE-2) {

       fprintf(stderr,"Too many chars\n");

      while (getchar() != '\n' && !feof(stdin));


    }
   else
    {


    childPID = fork();

    if (childPID < 0) {

        perror("fork");

        exit(-1);
    }
    if (childPID == 0) {

        parse(commands);

        exit(0);
    } else {

        if (waitpid(childPID, &status, 0) !=childPID) {
            perror("waitpid is not responding");
        } else
            if (!WIFEXITED(status)) {
            fprintf(stderr,"Unusually exit\n");
        }

        //putc('\n', stdout);
        //fputs(PROMPT,stdout);


    }


    }
    putc('\n', stdout);
   fputs(PROMPT,stdout); 
}
exit(0);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM