3

我已经开始研究使用 C 进行命令处理,但我遇到了这个 C 程序的问题。ls它在预期之前执行命令。

海合会信息:

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;
}

我所说的这段代码是这个特定的行:

    printf("Executing command: ls");

如果程序使用那段代码运行,则输出为:

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.

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

4

2 回答 2

7

这是一个缓冲问题。你需要做:

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

或者,如果您的输出是行缓冲终端,并且您可以添加一行而不是显式fflush(stdout)调用:

printf("Executing command ls\n"); 

标准输入法 101:

对操作系统的少量读/写效率低下,因此stdio IO(默认情况下)将每个文件句柄/描述符与输入缓冲区和输出缓冲区相关联。stdio output 调用 output 到适当的 FILE(在这种情况下,它是stdout)输出缓冲区(通过memcpying 字符串),并且只有当(大)缓冲区已满时,才会进行系统调用以写入整个缓冲区(问题已解决) .

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

stdio FILE的缓冲模式也可以使用setvbuf()函数显式操作。请参阅链接中的手册页以了解如何使用它。

于 2017-02-04T08:01:48.817 回答
6

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

添加新行会有所不同,因为新行会立即刷新缓冲区。您也可以使用fflushtoo 而不是换行符。

于 2017-02-04T08:04:10.530 回答