3

我试图从 c 执行系统调用。执行以下代码时,首先打印日期,然后 " Todays date is ..........:"在新行上打印。当我用printfputs 替换时,它按我的意图执行。(objdump显示的puts@plt代替了第二个printf)。谁能告诉我为什么会这样?

  #include <stdlib.h>

    int main() { printf(" Todays date is ..........:");

    system("/bin/date");
    printf("\n This is your exclusive shell\n");  
    system("/bin/sh");
    return 0; 
    }

提前致谢。

4

4 回答 4

4

printf()你的字符串放在一个缓冲区中,一旦你走下一行,它就会把它写到屏幕上。这就是为什么当你这样做时

printf(" Todays date is ..........:");

system("/bin/date");

您可能会先打印日期。

流是缓冲的stdout,因此只会在到达换行符后(或被告知时)显示缓冲区中的内容。您有几个选项可以立即打印:

  • 打印到,stderr而不是使用fprintf

    fprintf(stderr, "I will be printed immediately");
    
  • 需要时冲洗stdout以使用fflush

    printf("Buffered, will be flushed");
    fflush(stdout); // Will now print everything in the stdout buffer
    
  • 或者您也可以stdout使用以下方法禁用缓冲setbuf

    setbuf(stdout, NULL);
    
于 2013-08-20T11:14:12.380 回答
3
printf(" Todays date is ..........:");

==>

printf(" Todays date is ..........:\n");

或者fflush(stdout);在该printf行之后添加一个;

于 2013-08-20T11:12:29.187 回答
2

printf使用缓冲区。
如果您想立即打印文本,您必须致电fflush

printf(" Todays date is ..........:");
fflush(stdout);
system("/bin/date");
于 2013-08-20T11:17:07.300 回答
1
  #include <stdlib.h>  
  #include <stdio.h>

    int main() { printf(" Todays date is ..........:\n"); //add \n at the end. this is same behavior as puts. now date will print after this

    system("/bin/date");
    printf("\n This is your exclusive shell\n");  
    system("/bin/sh");
    return 0; 
    }  

否则你可以使用fflush(stdout);afterprintf("Todays date is ....:");声明

于 2013-08-20T11:38:12.997 回答