2010-10-30 39 views
3

我有一个C++ windows服务,当我调用system()函数来释放命令时,它有时会崩溃。我已经在Windows命令行中运行了命令的确切文本,并且它运行得很好,但由于某种原因,它在system()运行时失败。有没有比用system()更好的在C++中提取命令的方法?

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

那么,有没有不同的方法可以剔除我的命令?至少,如果出现问题,某些事情会给我一些信息,或者至少让我处理一个例外情况。

回答

0

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

+0

'exec'肯定会给你更多的控制过程。许多系统也具有'spawn'功能。 – 2010-10-30 20:51:35

+0

不太可能,因为它是Windows。更可能是CreateProcess或类似的。 – SimonJ 2010-10-30 20:53:05

+1

Fork在Windows API中不存在。 – 2010-10-30 22:07:03

1

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

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

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

编辑:如果它仍然只是无缘无故地崩溃,你可以尝试使用process monitor来看看下一步发生了什么。由于进程监视器的输出结果可能有点令人难以置信,我喜欢使用的一个技巧就是在调用system()之前向程序添加一个语句,以打开一个不存在的文件,如“C:\ MARKER.TXT”或其他内容,然后您可以在进程监视器输出中搜索文件的名称,然后查看可能与问题有关的条目。

+0

事情是,我的应用程序似乎只是在系统被调用时死亡。我打电话给系统后立即尝试记录一些内容,但我什么都没有收到。 – 2010-10-30 20:55:49

+0

你确定你传递给'system()'的字符串实际上包含你想要的吗?作为一个测试,你可以尝试使用不同的命令来运行'system()',比如'sleep'或者其他东西,看看它是否有效。 – WildCrustacean 2010-10-30 20:57:30

+0

运行系统(“dir”),看看你是否有东西 – 2010-10-30 21:03:41

1

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

0

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

有一个环境问题(缺少路径中的条目)或服务用于运行的帐户没有权限执行任何您试图运行的权限。

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

另一个需要注意的是服务中的路径。使用getenv(“PATH”)并查看您可能依赖的路径是否缺失。

希望这有助于...

0

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

相关问题