在C / C ++中使用popen()是一种糟糕的编码习惯吗?

时间:2017-04-21 08:44:18

标签: c++ linux unix timezone

我想更改Linux系统的时区。我知道有很多方法。 一种方法是使用 tzset()功能,另一种方法是调用' timedatectl '命令来自' popen()'功能。 我正在使用第二种方法,即使用" popen()"。

我只想问使用" popen()"这是一个很好的编程习惯吗?在您的代码中?

另外,我正在小心地打电话给#34; pclose()"每个" popen()"。

2 个答案:

答案 0 :(得分:0)

popen()调用shell来运行命令,这是一个额外不必要的间接层。此外,还存在各种安全隐患,例如,您无法控制环境 - 或实际调用哪个shell。

我说它适用于原型和概念证明,但对于生产代码,您应该使用fork(),IO的执行和管道之一。

修改

如果通过调用命令存在与doinf等效的函数,请始终先使用该函数。例如,如果您可以使用tzset()实现所需的目标,请始终优先使用它来生成新流程。

答案 1 :(得分:0)

一般来说popen没有错,如果你真的需要一个子进程为你做一个特定的工作。

popen创建一个管道,允许您读取子进程的输出(写入stdout的内容)或将输入写入其stdin - 但不能同时写入两者。

如果您对这两个选项都不感兴趣,您可能更愿意调用system(但是,system将等待进程终止,与popen相反 - pclose等待)。< / p>

但是,如果你可以通过简单地调用普通函数(系统调用与否)来完成相同的工作,那么为什么要创建一个单独的进程呢?您正在使用进程创建大量开销(进程必须初始化并挂钩到操作系统,它需要自己的内存用于可执行代码,堆和堆栈,......)!

如果有问题的工作需要相当长的时间并且您无法等待功能完成,它会变得有点复杂,但需要来做其他事情。但是,在这种情况下,我只是创建一个线程,然后再从那里调用该函数...