繁体   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