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

C program executing command before being told to

我已经开始研究用 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;
}

我说的这段代码是这一行:

    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.

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

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

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

或者,如果你的输出是一个 line-buffered 终端并且你没问题 添加一行而不是显式 fflush(stdout) 调用:

printf("Executing command ls\n"); 

stdio 101:

小 read/writes 到 OS 效率低下,因此 stdio IO(默认情况下)将每个文件 handle/descriptor 与输入缓冲区相关联和一个输出缓冲区。 stdio output 调用输出到适当的 FILE(在这种情况下,它是 stdout)输出缓冲区(通过 memcpying 字符串),并且只有当(大)缓冲区已满时才会进行写入整个缓冲区的系统调用(问题已解决)。

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

stdio FILE 的缓冲模式也可以使用 setvbuf() 函数显式操作。请参阅 link 中的联机帮助页以了解如何使用它。

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

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