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)输出缓冲区(通过 memcpy
ing 字符串),并且只有当(大)缓冲区已满时才会进行写入整个缓冲区的系统调用(问题已解决)。
fflush()
函数可以引发输出缓冲区的显式刷新。此外,如果 stdio 检测到输出文件是终端,它将使用行缓冲,这意味着它会在输出中遇到换行符时调用 fflush()
。
stdio FILE 的缓冲模式也可以使用 setvbuf() 函数显式操作。请参阅 link 中的联机帮助页以了解如何使用它。
通过 printf
的标准输出被缓冲,这意味着它不会在调用 printf
后立即刷新到目标。当您在调用 printf
之后使用 system
到 运行 一个单独的进程而没有被刷新时,新进程的输出可能会在您的 printf
被打印之前打印出来。
添加新行会有所不同,因为新行会立即刷新缓冲区。您也可以使用 fflush
而不是换行符。
我已经开始研究用 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)输出缓冲区(通过 memcpy
ing 字符串),并且只有当(大)缓冲区已满时才会进行写入整个缓冲区的系统调用(问题已解决)。
fflush()
函数可以引发输出缓冲区的显式刷新。此外,如果 stdio 检测到输出文件是终端,它将使用行缓冲,这意味着它会在输出中遇到换行符时调用 fflush()
。
stdio FILE 的缓冲模式也可以使用 setvbuf() 函数显式操作。请参阅 link 中的联机帮助页以了解如何使用它。
通过 printf
的标准输出被缓冲,这意味着它不会在调用 printf
后立即刷新到目标。当您在调用 printf
之后使用 system
到 运行 一个单独的进程而没有被刷新时,新进程的输出可能会在您的 printf
被打印之前打印出来。
添加新行会有所不同,因为新行会立即刷新缓冲区。您也可以使用 fflush
而不是换行符。