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