我想在C程序中执行Linux的终端命令。目前我正在使用system()
函数但我想使用任何其他函数,因为根据MISRA禁止system()
函数。
例如,我该如何替换
system("hwclock --systohc --utc");
答案 0 :(得分:4)
答案 1 :(得分:4)
首先,您可以使用fork()
创建子流程,然后在子流程中,您可以调用exec()
来执行您想要的命令。
有一个简单的例子:
$ chmod u+x command.sh
$ cat command.sh
#!/ usr / bin / env bash
ls -l </ p>
************* test.c ****************
#include<unistd.h>
int main(void)
{
execl("./command.sh","command.sh",(char*)0);
return 0;
}
答案 2 :(得分:0)
这是一个非常有趣的问题。我对MISRA C的理解是它提供了在关键系统中使用C语言的指南。但是包含system
函数的C语言标准库只是现代应用程序中常用的库代码总和的一小部分 - 通常甚至在嵌入式系统中也是如此。
我从未开发过MISRA标准的应用程序,而且我只能找到MISRA指南的稍早版本(从2004年开始)。据我所知,MISRA对使用POSIX库函数保持沉默,这些函数通常可用于任何基于Linux的系统。如果MISRA真的对POSIX库函数保持沉默,那么POSIX库中的任何函数都应该是不受限制的。这包括fork
,exec
和popen
,它们都是由POSIX定义的,而不是由C语言标准定义的。在这三者中,popen
可能与C system
函数的功能/接口最相似。
那就是说,你可能想问问自己为什么MISRA C限制使用system
函数,以及同样的理由是否同样适用于上述三个函数。
答案 3 :(得分:0)
使用 fork
+ exec
系列函数通常是建议的方法,而 a simple implementation is straightforward 但是我发现它是边缘情况的雷区。
system()
在内部使用 fork + exec,只需查看 glibc's implementation 其源代码就可以处理所有信号处理程序。但是信号处理程序清除+恢复必须以线程安全的方式处理,因此在多线程代码中还需要考虑竞争条件问题,这就是为什么 glib 的代码如此不可读。
如果可用,我建议您改用 posix_spawn,它对用户更加友好,并且与 system
不同,它具有更安全的界面。