我在Linux上开发的C代码,我想执行一个二进制说/usr/sbin/binary_program -p xxx
,有没有比system()
呼叫执行二进制的另一种方式?是否有另一种方法比系统()执行二进制
回答
是的,在一般情况下,system
不应该被使用,至少这些原因:
- 它从shell引用问题的种种危险遭遇,所以决不是一个硬编码的命令行是潜在的危险。
- 它不是线程安全的。
- 它会干扰调用程序中的信号处理。
- 除非命令明确地将输出保存到文件,否则它不提供从执行的程序获取输出的方式,除了退出状态。
为了执行外部程序,你应该使用posix_spawn
,或fork
随后的exec
- 家庭功能之一。但是,如果可能的话,应该避免依赖外部程序/命令,特别是在程序中直接进行工作时更容易且不易出错的情况下。例如,我已经看到了像system("sleep 1");
而不是sleep(1);
这样荒谬的用法。
'system'的一个更有用的替换是'popen',但它仍然有一些相同的问题(如shell引用)。 –
是的,您可以使用exec*
功能家族。
http://pubs.opengroup.org/onlinepubs/9699919799/functions/execv.html
如果需要模拟的system
行为可以fork
然后调用exec
功能。
的POSIX的system
page说:
系统()函数应行为,如果一个子进程使用fork()的创建和子进程使用execl的()如下调用SH工具:
execl(< shell path>,“sh”,“-c”,command,(char *)0);
请注意,'system'是通过'fork'-ing和'exec'后来'/ bin/sh -c'工作的,这也是标准化的。 –
认识到您可以同时运行多个程序并通过管道进行通信(或其他Inter Process Communication)很重要。这通常可能是通过系统调用的混合。
我强烈建议阅读Advanced Linux Programming,或其他一些好书解释了很多(比我们可以在几分钟内完成),对所涉及的各种syscalls(2),特别是fork(2),pipe(2),dup2(2),execve(2),waitpid(2)和其他几个人(也许poll(2)用于多路复用,例如以避免环形管道中的死锁)。该system(3)
功能这些系统调用(和/bin/sh
)
这高级Linux编程本书有专门处理一整章再建。
我还建议了解一个Unix命令shell是如何工作的。通过研究一些简单的免费外壳的源代码(如sash
)或者至少通过strace
来研究它。
实际上,popen(3)比system(3)更有用。您可以获取伴侣命令的输出。一些库(Poco,Qt,Glib/GTK)也具有强大的过程管理功能。
一个新的过程是用fork
创建的,这是棘手的了解。在execve
的同一过程中启动一个新程序。
所有进程fork
(或者vfork
)创造除了一些少数内核(/sbin/init
,/sbin/modprobe
,...)
- 1. 是否有另一种方法在java中执行repaint()?
- 2. 是否有另一种方法来启动进程比child_process中的方法?
- 3. 如何在另一种方法之前强制执行一种方法?
- 4. 二维数组迭代方法比另一种方法更快
- 5. 如何仅在执行第一种方法后执行第二种方法
- 6. 是否有另一种同步方式
- 7. 是否有强制执行finalize()方法的方法
- 8. 确定将执行哪种方法(类型系统)
- 9. 是否有另一种方法来设置spring.data.rest.base-path比忽略的属性?
- 10. 完成另一种方法后执行方法
- 11. 完成另一种方法后执行方法的问题 - iOS
- 12. 停止执行另一种方法的方法
- 13. 从Go执行第三方二进制
- 14. 从另一种方法运行方法
- 15. 找出是否有一种方法可以调用另一个方法
- 16. 无法执行二进制文件
- 17. cygwin - 无法执行二进制文件
- 18. 执行二进制搜索算法
- 19. bash,无法执行二进制文件
- 20. PhantomJs无法执行二进制文件
- 21. 无法执行二进制文件centos?
- 22. 是否有另一种方法来修复Yesod的nicHtmlField?
- 23. 另一种检查图像url的方法是否有效
- 24. 是否有另外一种方法来编写if语句?
- 25. 是否有另一种在DataGridView中显示数据的方法?
- 26. 是否有另一种删除多个头的方法?
- 27. 是否有另一种方法来验证$ _POST数据?
- 28. 是否有另一种方法来设置DataGrid列对齐?
- 29. 是否有另一种方法来过滤网格视图?
- 30. webassembly可能是一种强制执行drm的方法吗?
你看看'system'手册页底部开始奇迹般地查看“另请参阅”部分是否有任何内容? – Mat
你希望通过使用'system()'以外的东西解决哪些缺陷? –
如何使用dll共享对象并在运行时加载它? – 0x90