fgets错误消息循环-C中的Linux shell

fgets错误消息循环-C中的Linux shell,c,linux,shell,process,fgets,C,Linux,Shell,Process,Fgets,尝试构建一个LinuxShell除了顶部的一条错误消息之外,其他一切都很好 我设置LINE=81,它会打印出错误消息total length/LINE times。我很难找到解决的办法。我想这是因为它一直在循环,而且它总是有这种情况,所以它会打印出来。我不希望它终止,只是刷新并继续输入,有什么想法吗?我被要求提供错误消息 编辑:添加“\n”时,其功能仍然相同 char commands[LINE]; while (fgets(commands, LINE, stdin)!= NULL) {

尝试构建一个LinuxShell除了顶部的一条错误消息之外,其他一切都很好

我设置LINE=81,它会打印出错误消息total length/LINE times。我很难找到解决的办法。我想这是因为它一直在循环,而且它总是有这种情况,所以它会打印出来。我不希望它终止,只是刷新并继续输入,有什么想法吗?我被要求提供错误消息

编辑:添加“\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);
}
char命令[行];
while(fgets(命令、行、标准输入)!=NULL){
如果(strlen(命令)>=行-1){
printf(“参数太多,请输入%d个字符,\n”,第2行);
继续;
}
childPID=fork();
if(childPID<0){
佩罗尔(“福克”);
出口(-1);
}
if(childPID==0){
解析(命令);
出口(0);
}否则{
if(waitpid(childPID,&status,0)!=childPID){
佩罗(“waitpid”);
}否则
如果(!妻子退出(状态)){
printf(“异常退出\n”);
}
putc('\n',stdout);
FPUT(提示、标准输出);
}
命令[0]='\0';
}
出口(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);
while(fgets(命令、行、标准输入)!=NULL){
如果(strlen(命令)>第2行){
fprintf(stderr,“字符太多”);
而(getchar()!='\n'&&&!feof(stdin));
}
其他的
{
childPID=fork();
if(childPID<0){
佩罗尔(“福克”);
出口(-1);
}
if(childPID==0){
解析(命令);
出口(0);
}否则{
if(waitpid(childPID,&status,0)!=childPID){
perror(“waitpid未响应”);
}否则
如果(!妻子退出(状态)){
fprintf(stderr,“异常退出”\n);
}
//putc('\n',stdout);
//FPUT(提示、标准输出);
}
}
putc('\n',stdout);
FPUT(提示、标准输出);
}
出口(0);

}

您应该使用-或者,在交互式程序中,-并使用所有警告和调试信息(
gcc-Wall-g
)编译您得到的错误是什么。不需要在循环中进行
strlen
检查,在提供的缓冲区中写入的字符(在您的情况下)不得超过
LINE
,包括可能的换行符和终止符。我需要提供和错误消息。。。。那是愚蠢的。您发布的代码显示fgets错误。我想知道那是什么错误??如果这就是你所说的哑巴,那么聪明的家伙必须告诉你什么是错误。或者,调用<代码> FFLUSS这也会起作用,尽管它让用户处于中间。通常最好在一条消息后开始换行。所以如果我只想打印一次…我不能?因为孩子会再次冲洗它?它似乎会根据用户输入的量多次打印消息,但如果您先在父级中刷新消息,无论是通过打印换行符还是调用
fflush
,子级中都没有副本。