我需要在C ++脚本中运行这个shell命令:
“/ usr / local / bin / mjpg_streamer -i”/usr/local/lib/input_uvc.so“-o”/usr/local/lib/output_http.so -w / usr / local / www“-b “
此命令启动一个广播视频源的应用程序。当我在C ++中通过system()执行此命令时,应用程序无法正常启动。
我用:
system("/usr/local/bin/mjpg_streamer -i \"/usr/local/lib/input_uvc.so\" -o \"/usr/local/lib/output_http.so –w /usr/local/www\" -b");
当我在使用C ++应用程序启动视频流后尝试访问视频流时,网页返回:
501:未实施!
没有配置www文件夹
我不能指望你们给我一个与应用程序相关的解决方案,但我想知道使用system()的C ++应用程序的命令和直接在终端中输入的命令的执行方式是否存在差异。< / p>
编辑:应用程序在IP:8080上广播视频流。我通过在浏览器中访问该IP来访问它。通常它打开一个包含流的网页但是当我用C ++应用程序执行命令时,我得到了这个错误。
答案 0 :(得分:2)
编辑:错误引用错误的旧观念是错误的;我意识到-w
实际上是output_http.so
的一个选项,所以整个shebang必须作为单个参数传递给-o
选项,如here或{{3}所示等等。
在这种情况下,请检查文件权限等。/ usr / local / www是否存在?你是否有可能从root shell运行shell命令?
<小时/> 嘿,我也有书推荐,here:"one of the best tech books ever published"。那家伙知道 - 抱歉:知道 - 他在说什么。
答案 1 :(得分:1)
我会避免使用http://www.daimto.com/webmaster-tools-api-with-c/库函数,或者至少检查它返回的错误代码。我不明白为什么你在命令中使用"
(我相信在你的特定情况下,你不需要它们;但一般要注意system(3)!)。阅读code injection
您可以使用globbing来至少获取命令的输出。
更好的是,使用popen(3)&amp;编码运行mjpg_streamer
程序。 fork(2)&amp; execve(2)和其他waitpid(2)(可能是syscalls(2),pipe(2),poll(2)等等。请阅读dup2(2)了解更多信息。