[英]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.