to system() or fork()/exec()?
to system() or fork()/exec()?
在unix中,似乎有两种常见的从C运行外部可执行文件的方法,即
system()
呼叫和
pid = fork()
switch(pid)
//switch statement based on return value of pid,
//one branch of which will include and exec() command
如果fork/exec在功能上是等效的(父进程等待子进程完成,而子进程没有返回复杂的信息),那么有什么理由更喜欢forx/exec而不是系统吗?。
system
执行命令解释器,即shell,它(a)比直接fork/exec慢,(b)在不同的系统上可能表现不同,(c)如果您从不受信任的源向其传递字符串,则会带来潜在的安全隐患。此外,system
会等待子进程退出,而您可能希望它与父进程同时运行。
更一般地说,底层fork/exec为您提供了额外的控制:在这两个操作之前或之间,您可能需要chdir
、打开管道、关闭文件描述符、设置共享内存等。
(我所说的不同系统并不是指Windows与Unix(因为Windows甚至没有分叉):我说的是Red Hat Linux与Ubuntu。前者使用Bash来执行传递给system
的内容,后者是一个轻量级的POSIX兼容shell。)
fork()
创建一个新流程。如果不需要这样做,只需使用system()
(或popen()
)。您可能想要第二个进程来实现并行性,或者对作业进行更细粒度的控制,但如果作业是同步的,通常您并不关心这一点。
另一方面,我发现system()
的95%的使用是不必要的,或者以另一种方式(例如使用zlib而不是system("gzip")
)会更好。所以也许最好的答案是两者都不用!
通过system()
还会调用一个shell进程,这可能不是您想要的。
此外,只有当这样的shell死亡时,调用进程才会得到通知,而不是当shell运行的实际进程死亡时。
system()将键入命令并像用户键入的那样执行它。我看到的大多是system("pause"); system("cls");
但是,如果您需要控制子进程,则需要fork.
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- 模式"allocate memory or use existing data"
- N-API include an .so or dll
- 已解决 - C++ 的崇高文本中的"fatal error: opencv: no such file or directory"
- 将 OR 逻辑运算符从 C++ 转换为 Fortran
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- 我如何将 OR 与 if 语句一起使用字符串
- 将 if 语句中的字符与 or 进行比较
- OpenSSL C API:如何在程序exec()之后恢复TLS连接?
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- "No such file or directory" C++标头问题
- 处理 std::enable_if<...中谓词的逻辑"OR">
- C++ 虽然语句不适用于字符串和"or"
- C++ : fork/exec or pthread?
- 编译错误:"g++: error trying to exec 'cc1plus': execvp: No such file or directory"
- to system() or fork()/exec()?