有没有比使用system()更好的方法来在C ++中发出命令?

时间:2010-10-30 20:45:51

标签: c++ windows shell system

我有一个C ++ Windows服务,当我调用system()函数来发出命令时,它有时会崩溃。我在windows命令行中运行了该命令的确切文本,它运行得很好,但由于某种原因,它在运行system()时失败。

更糟糕的是,我似乎无法获得有关system()失败原因的任何信息。似乎没有引发异常,因为我正在捕捉(......)并且没有任何事情被抓住。我的服务刚停止运行。我知道这是对system()的调用失败,因为我在调用之前和之后都放了日志信息,之后的任何事情都没有记录任何内容。

那么,我可以通过不同的方式解决命令吗?至少,如果出现问题,会给我一些信息,或者至少让我处理异常或其他事情。

5 个答案:

答案 0 :(得分:1)

我相信system()在技术上是C标准库的一部分,因此不会抛出异常。您应该能够检查返回代码或ERRNO变量以获取有关所发生情况的一些信息。此MSDN链接包含有关Windows上可能的返回代码的一些信息。

我还看到system()由于其他外部原因而失败,例如病毒扫描程序,因此您也可以对其进行调查。

我不知道运行shell命令的更好方法,但我可能错了。

编辑:如果它仍然无缘无故崩溃,您可以尝试使用process monitor查看较低级别的内容。由于进程监视器的输出可能有点压倒性,我喜欢使用的技巧是在调用system()之前向程序添加语句以打开不存在的文件,如“C:\ MARKER.TXT”或者其他什么,然后你可以在进程监视器输出中搜索文件的名称,然后查看可能与问题有关的条目。

答案 1 :(得分:1)

普通的catch()不会捕获致命异常(例如分段错误)。您必须使用结构化异常处理。更好的是,启用验尸调试; this article解释了如何启用服务的事后调试。

答案 2 :(得分:0)

你可以使用fork / exec,但我认为这就是系统正在做的事情。

答案 3 :(得分:0)

我认为您的问题可能是与您的服务相关联的用户帐户。

存在环境问题(路径中缺少条目)或服务用于运行的帐户无权执行您尝试运行的任何内容。

运行services.msc并查看服务的属性。 在登录页面上,作为测试,更改设置,以便它使用您的帐户运行服务。如果成功,你就知道问题所在。

另一件需要注意的是服务内部的路径。使用getenv(“PATH”)并查看是否缺少可能依赖的路径。

希望这会有所帮助......

答案 4 :(得分:0)

我最终使用了CreateProcess。到目前为止一直在努力。