如何丢弃C语言中system()调用系统命令的输出?
如何在C语言中执行系统命令并丢弃输出同时统计执行时间?
嘿,我来帮你搞定这个需求!你现在的代码调用了system("ls"),想要统计这个命令的执行时间,还不想让命令的输出显示在终端里,对吧?这其实分两步就能解决,我给你详细说说:
一、丢弃系统命令的输出
在Linux/Unix系统里,我们可以通过输出重定向把命令的所有输出(包括正常输出和错误信息)扔到/dev/null这个"数据黑洞"里——任何写入这里的内容都会被直接丢弃,不会显示出来。
只需要把你原来的system("ls")改成:
system("ls > /dev/null 2>&1");
这里的每个部分作用是:
> /dev/null:把命令的**标准输出(stdout)**重定向到/dev/null2>&1:把命令的**标准错误(stderr,比如ls找不到文件时的报错)**也重定向到和标准输出一样的位置,确保所有输出都被丢弃
如果是Windows系统,把/dev/null换成nul就行,比如system("dir > nul 2>&1");
二、统计命令的执行时间
接下来我们可以用C语言的标准库或者系统调用函数来统计时间,这里给你两种常用的方案:
方案1:用clock()统计CPU时间(简单易用)
clock()函数会返回程序从启动到当前的CPU时钟周期数,适合统计命令实际占用CPU的时间:
#include <stdio.h> #include <time.h> #include <stdlib.h> // system()函数需要这个头文件 int main(int argc, char* argv[]) { clock_t start_time, end_time; double cpu_time; // 记录命令执行前的时间 start_time = clock(); // 执行命令并丢弃所有输出 int cmd_status = system("ls > /dev/null 2>&1"); // 记录命令执行后的时间 end_time = clock(); // 计算耗时(转换成秒) cpu_time = ((double)(end_time - start_time)) / CLOCKS_PER_SEC; printf("命令执行的CPU耗时:%.4f 秒\n", cpu_time); // 检查system调用是否成功 if (cmd_status == -1) { perror("system函数调用失败"); return 1; } return 0; }
方案2:用gettimeofday()统计实际流逝时间(更精确)
如果你需要统计从命令开始到结束的实际墙上时间(包括等待IO、系统调度的时间),可以用gettimeofday(),它能精确到微秒:
#include <stdio.h> #include <sys/time.h> #include <stdlib.h> int main(int argc, char* argv[]) { struct timeval start, end; double elapsed_time; // 记录开始时间 gettimeofday(&start, NULL); int cmd_status = system("ls > /dev/null 2>&1"); // 记录结束时间 gettimeofday(&end, NULL); // 计算实际流逝的时间(秒为单位) elapsed_time = (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) / 1000000.0; printf("命令执行的实际耗时:%.6f 秒\n", elapsed_time); if (cmd_status == -1) { perror("system函数调用失败"); return 1; } return 0; }
小提醒
- 直接用gcc编译就行:
gcc your_code.c -o timer,不需要额外链接库 - 如果你的命令里有特殊字符(比如空格、通配符),要注意shell的解析问题,确保命令能正确执行
内容的提问来源于stack exchange,提问作者user9179677
相关产品推荐
相关产品推荐

