C程序在被告知之前执行命令

C程序在被告知之前执行命令,c,printf,command-execution,C,Printf,Command Execution,我已经开始研究C语言的命令处理,但是我发现这个C程序有一个问题。它正在执行ls命令 Gcc信息: gcc version 6.2.1 20161124 (Debian 6.2.1-5) 代码如下: #include <stdio.h> #include <stdlib.h> int main() { int i; printf("Is command processor available?\n"); if (system(NULL))

我已经开始研究C语言的命令处理,但是我发现这个C程序有一个问题。它正在执行
ls
命令

Gcc信息:

gcc version 6.2.1 20161124 (Debian 6.2.1-5)
代码如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i;

    printf("Is command processor available?\n");
    if (system(NULL))
    {
        printf("Command processor available!\n");
    }
    else
    {
        printf("Command processor not available!\n");
        exit(1);
    }

    printf("Executing command ls");
    i=system("ls");

    printf("Returned value is: %d.\n",i);
    return 0;
}
如果使用该代码运行程序,则输出为:

Is command processor available?
Command processor is available
systemProcessing  systemProcessing.c
Executing command: lsReturned value is: 0.
它在实际被告知之前执行命令

但当我用新行“\n”结束代码时,其输出与预期一样:

Is command processor available?
Command processor is available
Executing command: ls
systemProcessing  systemProcessing.c
Returned value is: 0.

为什么在字符串中添加换行符后,代码会在执行之前打印出它将要执行的操作,但如果没有换行符,代码会执行,然后打印出将要执行的操作?

这是一个缓冲问题。您需要执行以下操作:

printf("Executing command ls");
fflush(stdout); //<<
i=system("ls");

stdio101:

对操作系统的小读/写效率很低,因此stdio IO(默认情况下)将每个文件句柄/描述符与输入缓冲区和输出缓冲区相关联。stdio output将output调用到相应文件(在本例中为stdout)的输出缓冲区(通过
memcpy
ing字符串),并且只有当(大)缓冲区已满时,才会进行系统调用以写入整个缓冲区(问题已解决)

可以使用
fflush()
函数引发输出缓冲区的显式刷新。此外,如果stdio检测到输出文件是终端,它将使用行缓冲,这意味着每当遇到输出中的换行符时,它将调用
fflush()


stdio文件的缓冲模式也可以通过函数显式操作。请参阅链接中的手册页,了解如何使用它

通过
printf
的标准输出被缓冲,这意味着它不会在调用
printf
后立即刷新到目标。当您在调用
printf
后使用
system
运行单独的进程而不刷新该进程时,新进程的输出可能会在打印
printf
之前打印出来


添加新行会产生不同,因为新行会立即刷新缓冲区。您也可以使用
fflush
而不是newline。

您给出的答案是信息丰富的,将其实现到代码中非常有效!我希望有一天能像你一样学识渊博:)谢谢!
printf("Executing command ls");
fflush(stdout); //<<
i=system("ls");
printf("Executing command ls\n");