2

可能重复:
如何在 Windows 上用 C++ 创建进程?

我应该如何在 Windows 中从另一个程序运行一个程序?为什么system()不好?我读过这个,但从 Unix 的角度来看,它似乎涵盖了这个主题。

4

5 回答 5

2

生成子进程是一个非常依赖于操作系统的过程。stdlib.h 中的 system() 在设计时考虑了 Unix 环境,并且不是线程安全的。使用 system() 可以在任何 C 环境中工作,但结果是严格没有定义的。此外,当使用 system() 时,父进程必须等到子进程退出将显着减慢您的应用程序。

于 2013-01-04T16:28:28.923 回答
2

如果您需要更多的控制和监控,还有更复杂的选项。对于 unix 系统,有 fork() 函数和 exec() 函数。对于 Windows,特别是有 CreateProcess() 函数。

第二,

system()对于简单的程序来说没问题,但是系统提供的灵活性较低,而且它会比用 C/C++ 语言实现的东西慢得多。

于 2013-01-04T16:14:14.017 回答
1

有一种简单的方法可以从另一个程序中运行一个程序。假设您想从另一个程序运行 HelloWorld.cpp。只需编写如下内容:

    #include<iostream>
    using namespace std;
    int main(void)
    {
       system("g++ -o abcd HelloWorld.cpp && ./abcd");
      return 0;
    }

(这假设程序位于您所在的目录中。)

于 2013-01-04T17:40:15.680 回答
0

system不是魔鬼。在大多数情况下,这只是您不打算做的事情。

首先,您要问的几乎是不可能的:操作系统管理进程的方式是使操作系统与众不同的原因之一,因此不要指望一种单一的方式可以与所有操作系统一起工作。

除非您正在使用非常基本的功能,例如system. 但做什么system,其实不只是启动一个程序。它启动操作系统默认命令解释器,并为它提供您传递给该函数的字符串。对于大多数操作系统,这将导致启动程序。但是之后会发生什么,不仅取决于目标操作系统是什么,还取决于它的配置方式以及调用进程相对于它的权限。

很容易欺骗这样的命令:只要让解释器沿着它的搜索路径找到一个与你要调用的程序同名的批处理文件,它就会被执行。简单地说,任何人,即使不接触您的代码,也可以在您或您的用户不知情的情况下让您的代码执行他喜欢的任何事情。一个非常棒的特洛伊木马竞技场!不是可以依赖的东西,尤其是在安全性很重要的地方。

但是......如果您正在编写一个系统实用程序,其目的是自动化一组系统操作,system那么很可能是您需要的。

于 2013-01-04T18:14:28.670 回答
0

为什么 system() 不好?

好吧,我不知道它本身是否不好,但如果你正在生成另一个进程,你最想对进程进行某种控制。像ShellExecute这样的调用为您提供了更多选项来微调过程,最重要的是获得一个句柄,您可以使用该句柄进行进一步的通信。system()OTOH 不会告诉您该过程是否已经开始。

如果您正在进行 Windows 编程(并且没有可移植性要求),那么我建议您尽可能使用 WinAPI 以获得最佳结果。例如文件处理、共享内存等。

于 2013-01-04T17:48:29.043 回答