C程序在被告知之前执行命令
我已经开始研究C语言的命令处理,但是我发现这个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))
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");