从system()更改为exec(),是否会加快代码的速度?

从system()更改为exec(),是否会加快代码的速度?,c,linux,embedded,embedded-linux,C,Linux,Embedded,Embedded Linux,我需要在我的C代码中执行一些Linux命令行,所以我选择使用system()。不幸的是,它放在而(1)中,可能会使我的程序变慢。如果我使用exec()family,它会改进吗?如果是,您能告诉我如何将此行从system()转换为exec()? 谢谢你相当于 system("echo \"x = 800 , y = 480 , swap = swap_32_16\">" "/sys/bus/platform/drivers/display/layer0"); 有点像 exec

我需要在我的C代码中执行一些Linux命令行,所以我选择使用
system()
。不幸的是,它放在
而(1)
中,可能会使我的程序变慢。如果我使用
exec()
family,它会改进吗?如果是,您能告诉我如何将此行从
system()
转换为
exec()?


谢谢你

相当于

system("echo \"x = 800 , y = 480 , swap = swap_32_16\">"
       "/sys/bus/platform/drivers/display/layer0");
有点像

execl("/bin/sh", "/bin/sh", "-c", "echo \"x = 800 , y = 480,"
      " swap = swap_32_16\">/sys/bus/platform/drivers/display/layer0", (char*)NULL);
问题是,
系统
执行的命令(在新分叉的子流程中)完全相同,只需输入更多。由于
exec
将当前进程替换为新执行的程序,因此
exec
调用将是程序执行的最后一个调用,除非先执行
fork()
进程。。。处理失败和。。。等待子流程等的完成


真正的解决方案当然是根本不使用外部命令,只需在C中这样做:

FILE *f = fopen("/sys/bus/platform/drivers/display/layer0", "w");
if (!f) { 
    // ... could not open ... 
}
fputs("x = 800 , y = 480 , swap = swap_32_16\n", f);
fclose(f);

或者您可以使用POSIX
open()
/
write()
/
close()
,以获得更少的开销(假设您的C编译器/运行时环境提供了它们):


为简洁起见,省略了正确的标题和所有错误检查。

那么
系统
函数通常启动一个shell来执行命令(使用
fork
exec
),除非shell内置了命令
echo
,否则它必须依次执行
fork
exec
。这是运行命令的两个
fork
exec
调用。每个人只能用一个。但是,如果您自己做,那么您必须设置文件描述符来自己处理重定向,因此将需要更多的代码。更多的代码意味着更多的复杂性和更多的bug。最后,如果你真的很好奇,那就测试它吧!对每个变量多次执行,并测量尝试次数,以获得可比较的平均值。在这种情况下,开销较小,但一旦开始格式化内容,系统调用将再次获得更多;)@我对此表示怀疑。echo命令在从shell或shell脚本发出时可能是轻量级的,但在每次迭代中,整个命令shell都是为了从C代码执行它而启动的。@Clifford啊,我将这与我的回答进行对比谢谢,这是个好主意,但我不知道为什么,它不适用于fopen()、fputs(),而适用于open(),写()有趣的东西。然后使用open+write
FILE *f = fopen("/sys/bus/platform/drivers/display/layer0", "w");
if (!f) { 
    // ... could not open ... 
}
fputs("x = 800 , y = 480 , swap = swap_32_16\n", f);
fclose(f);
static char data[] = "x = 800 , y = 480 , swap = swap_32_16\n";
int fd = open( "/sys/bus/platform/drivers/display/layer0", O_WRONLY );
write( fd, data, strlen( data ) );
close( fd );