c Linux中system()的替代方案,用于在linux上执行终端命令

时间:2015-06-05 09:01:01

标签: c linux misra

我想在C程序中执行Linux的终端命令。目前我正在使用system()函数但我想使用任何其他函数,因为根据MISRA禁止system()函数。

例如,我该如何替换

 system("hwclock --systohc --utc");

4 个答案:

答案 0 :(得分:4)

您可以使用fork(),然后查找exec()系列函数。

或者,您也可以查看popen()

答案 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库中的任何函数都应该是不受限制的。这包括forkexecpopen,它们都是由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 不同,它具有更安全的界面。