C++调用system32 cmd.exe函数,如何不弹cmd.exe程序窗口

首先,该程序运行,需要很大的数据,需要很大内存。在测试小数据的时候,程序没有任何问题,在运行测试大数据的时候,出现问题。个人认为程序本身编程代码应该没有问题。
通过程序错误定位,定位到了system命令。system命令调用,程序根本没有反应。完全将system命令忽略。
=========================
每个命令都有返回值,重新试过,发现调用system命令的返回值都是-1.
&&cerr&&"before pdflatex"&&&& &sprintf( cmd, "%s %s", "pdflatex -output-directory=/home/user/evaluation", outfilename );&&&cerr&&"pdflatex : "&&outfilename&&&& &system_cmd =&system( cmd );&& &cerr&&"system_cmd : "&&system_cmd&&&& &system_cmd =&system( cmd );&& &cerr&&"system_cmd : "&&system_cmd&&
=========================
研究system命令。为何返回-1?
system()会调用fork()产生子进程,由子进程来调用/bin/sh-c&string来执行参数string字符串所代表的命令,此命&令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
如果fork()失败&返回-1:出现错误
如果exec()失败,表示不能执行Shell,返回值相当于Shell执行了exit(127)
如果执行成功则返回子Shell的终止状态
如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值&。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为&system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。
=====================================
那么,将错误定位为fork()失败。
下面是fork():
fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
在父进程中,fork返回新创建子进程的进程ID;
在子进程中,fork返回0;
如果出现错误,fork返回一个负值;
fork出错可能有两种原因:
(1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。
(2)系统内存不足,这时errno的值被设置为ENOMEM。(关于errno的意义,请参考本系列的第一篇文章。)
fork系统调用出错的可能性很小,而且如果出错,一般都为第一种错误。如果出现第二种错误,说明系统已经没有可分配的内存,正处于崩溃的边缘,这种情况对Linux来说是很罕见的。
============================
下面想到的就是查看errno的内容。
当中的C&api函数发生异常时,一般会将变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因,在实际中用这一招解决了不少原本看来莫名其妙的问题。但是 errno是一个数字,代表的具体含义还要到errno.h中去阅读宏,而每次查阅是一件很繁琐的事情。有下面几种方法可以方便的得到错误信息&(1)void perror(const char *s)说明perror ( )用来将上一个函数发生错误的原因到标准错误(stderr),参数s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量 errno 的值来决定要输出的字符串。&(2) char *strerror(int errno)将错误代码转换为字符串错误信息,可以将该字符串和其它的信息组合输出到用户界面例如fprintf(stderr,"error in CreateProcess %s, Process ID %d ",strerror(errno),processID)注:假设processID是一个已经获取了的整形ID&(3)printf("%m", errno);另外不是所有的地方发生错误的时候都可以通过error获取错误代码,例如下面的代码段#include"stdio.h"#include "stdlib.h"#include "errno.h"#include "netdb.h"#include "sys/types.h"#include "netinet/in.h"int main (int argc, char *argv[]){struct hostent *h;if (argc != 2){fprintf (stderr ,"usage: getip address\n");exit(1);}if((h=gethostbyname(argv[1])) == NULL){herror(&gethostbyname&);exit(1);}printf(&Host name : %s\n&, h-&h_name);printf(&IP Address : %s\n&, inet_ntoa (*((struct in_addr *)h-&h_addr)));return 0;}
&通过上面的代码可以看到:使用gethostbyname()函数,你不能使用perror()来输出错误信息(因为错误代码存储在 h_errno 中而不是errno 中。所以,你需要调用herror()函数。你简单的传给gethostbyname() 一个机器名(&bbs.&),然后就从返回的结构struct hostent 中得到了IP 等其他信息.程序中输出IP 地址的程序需要解释一下:h-&h_addr 是一个char*,但是inet_ntoa()函数需要传递的是一个struct in_addr 结构。所以上面将h-&h_addr 强制转换为struct in_addr*,然后通过它得到了所有数据。
&============================
阅读(...) 评论()c++中怎么用system函数打开当前文件夹里的可执行程序(.exe)_百度知道
c++中怎么用system函数打开当前文件夹里的可执行程序(.exe)
这个文件里有一个名字为main,调用system()函数打开那个main.cpp文件建了一个c++工程.exe的可执行程序,新建一个mymain.exe程序,怎么在mymain.cpp文件中写代码,在建好的工程文件夹里复制粘贴了一个名字为123的文件夹
class文件;start 123\&#92,怎么用system()函数实现运行main.class的java可执行文件.exe&)是对的,再问下如果在123文件夹里还有一个main我试了下system(&quot
提问者采纳
ystem(&);start 123\main.exe&quot
我试了下system(&start 123\\main.exe&)是对的,再问下如果在123文件夹里还有一个main.class的java可执行文件,怎么用system()函数实现运行main.class文件?
system(&java 123\\main&);
其他类似问题
为您推荐:
可执行程序的相关知识
其他2条回答
system(&E:例如&#92使用如下语句;\).exe&quot.exe在E盘的VC文件夹下:\VC&#92
这个我知道的,但是我的意思是那个main.exe一定在那个建好的c++工程文件夹里
试试:system(&main.exe&);
使用如下语句:例如main.exe在E盘的VC文件夹下:system(&E:\\VC\\main.exe&);
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID1792662空间积分0 积分43阅读权限10帖子精华可用积分43 信誉积分100 专家积分0 在线时间0 小时注册时间最后登录
白手起家, 积分 43, 距离下一级还需 157 积分
帖子主题精华可用积分43 信誉积分100 专家积分0 在线时间0 小时注册时间最后登录
论坛徽章:0
可视化窗口,比如一个按牛(请点这里),点了就打开了CMD.EXE?
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
UID353655空间积分0 积分7阅读权限10帖子精华可用积分7 信誉积分100 专家积分0 在线时间0 小时注册时间最后登录
白手起家, 积分 7, 距离下一级还需 193 积分
帖子主题精华可用积分7 信誉积分100 专家积分0 在线时间0 小时注册时间最后登录
论坛徽章:0
我也想知道 高手出现
&&自强不息,厚德载物。
书中自有黄金屋~
UID59939空间积分0 积分20167阅读权限100帖子精华可用积分20167 信誉积分867 专家积分1565 在线时间7264 小时注册时间最后登录
帖子主题精华可用积分20167 信誉积分867 专家积分1565 在线时间7264 小时注册时间最后登录
论坛徽章:1
system(&cmd&);
不知道行不行,^_^。
UID空间积分0 积分4793阅读权限50帖子精华可用积分4793 信誉积分1219 专家积分54 在线时间1344 小时注册时间最后登录
小富即安, 积分 4793, 距离下一级还需 207 积分
帖子主题精华可用积分4793 信誉积分1219 专家积分54 在线时间1344 小时注册时间最后登录
认证徽章论坛徽章:2
ShellExecute(&open&, &cmd&, NULL,...);
自己看MSDN吧
UID空间积分807 积分1134阅读权限30帖子精华可用积分1134 信誉积分133 专家积分10 在线时间225 小时注册时间最后登录
家境小康, 积分 1134, 距离下一级还需 866 积分
帖子主题精华可用积分1134 信誉积分133 专家积分10 在线时间225 小时注册时间最后登录
论坛徽章:0
【光环使者】
UID空间积分0 积分378阅读权限20帖子精华可用积分379 信誉积分127 专家积分0 在线时间7 小时注册时间最后登录
稍有积蓄, 积分 378, 距离下一级还需 122 积分
帖子主题精华可用积分379 信誉积分127 专家积分0 在线时间7 小时注册时间最后登录
论坛徽章:0
原帖由 aero 于
10:52 发表
system(&cmd"
不知道行不行,^_^。
UID空间积分0 积分270阅读权限20帖子精华可用积分271 信誉积分180 专家积分0 在线时间231 小时注册时间最后登录
稍有积蓄, 积分 270, 距离下一级还需 230 积分
帖子主题精华可用积分271 信誉积分180 专家积分0 在线时间231 小时注册时间最后登录
论坛徽章:0
回复 1楼 1021 的帖子
搞不清,你想干嘛!!你在window还是linux下啊!?
UID空间积分0 积分1594阅读权限100帖子精华可用积分1594 信誉积分135 专家积分0 在线时间530 小时注册时间最后登录
帖子主题精华可用积分1594 信誉积分135 专家积分0 在线时间530 小时注册时间最后登录
论坛徽章:0
win下用Loadibrary函数
在msdn里看看详细的说明!
地振高冈,一派溪山千古秀;
门朝大海,三河合水万年流
UID1792662空间积分0 积分43阅读权限10帖子精华可用积分43 信誉积分100 专家积分0 在线时间0 小时注册时间最后登录
白手起家, 积分 43, 距离下一级还需 157 积分
帖子主题精华可用积分43 信誉积分100 专家积分0 在线时间0 小时注册时间最后登录
论坛徽章:0
原帖由 aero 于
10:52 发表
system(&cmd&);
不知道行不行,^_^。
搞定,谢谢楼上各位
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处共有 3577 人关注过本帖
标题:如何在应用程序中调用CMD并返回运行结果
等 级:论坛游民
帖 子:33
专家分:26
结帖率:100%
&&已结贴√
&&问题点数:0&&回复次数:12&&&
如何在应用程序中调用CMD并返回运行结果
要求做一个图形界面的应用程序,输入命令行的命令,在后台调用CMD程序执行该命令但不显示DOS命令行窗口,而且能实时显示运行的结果。哪位知道怎么处理?谢啦
搜索更多相关主题的帖子:
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
&&得分:20&
你可以调用CreateProcess创建cmd进程,在启动信息结构内将窗体设为不显示,并将它的stdout句柄重定向到你创建的一个匿名管道上,执行它后,你就可以从这个匿名管道读取它的执行结果了。
举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
等 级:论坛游民
帖 子:33
专家分:26
回复 2楼 东海一鱼
附上我写的代码
基本实现了CMD命令的调用和读取,但是想在此基础上使结果输出更加向命令行的输出,也就是希望命令行输出一些结果,应用程序能相应的显示这部分结果。要实现这个,如何在现有的程序上进行修改呢?
附件: 只有本站会员才能下载或查看附件,请
等 级:论坛游民
帖 子:33
专家分:26
回复 2楼 东海一鱼
void CLikeCmdDlg::OnBtnExe()
&&& // TODO: Add your control notification handler code here
&&& UpdateData();
&&& CString cs(m_childProcess);
&&& cs += m_
&&& LPTSTR lpsz = (LPTSTR)(LPCTSTR)
&&& m_editoutput = &&;
&&& UpdateData(FALSE);
&&& SECURITY_ATTRIBUTES
&&& HANDLE hRead,hW
&&& sa.nLength = sizeof(SECURITY_ATTRIBUTES);
&&& sa.lpSecurityDescriptor = NULL;
&&& sa.bInheritHandle = TRUE;
&&& if (!CreatePipe(&hRead,&hWrite,&sa,0))
&&&&&&&&MessageBox(&Error on CreatePipe()!&);
&&& STARTUPINFO
&&& PROCESS_INFORMATION
&&& si.cb = sizeof(STARTUPINFO);
&&& GetStartupInfo(&si);
&&& si.hStdError = hW
&&& si.hStdOutput = hW
&&& si.wShowWindow = SW_HIDE;
&&& si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
&&& if (!CreateProcess(NULL,/*&c:\\windows\\system32\\cmd.exe /c &*/lpsz,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
&&&&&&&&MessageBox(&Error on CreateProcess()!&);
&&& CloseHandle(hWrite);
//&&& system(&&);
&&& char buffer[4096];
&&& memset(buffer,0,4096);
&&& DWORD byteR
&&& while(true)
&&&&&&&&if (ReadFile(hRead,buffer,4095,&byteRead,NULL) == NULL)
&&&&&&&&&&&&
&&&&&&&&m_editoutput +=
&&&&&&&&UpdateData(FALSE);
&&&&&&&&Sleep(200);
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
那你需要创建两个管道(分别读、写),然后处理你的ON_CHAR消息即可向下发送输入。
另外你的读方式也有问题,最好在线程里面实现。不然UI可能会失去响应。
举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
等 级:论坛游民
帖 子:33
专家分:26
回复 5楼 东海一鱼
两个管道分别读写,那能保证是同一个数据吗?
管道这东西还是刚接触,好多概念都不懂
另外调用命令行的命令时,怎么知道它什么时候有运行结果了,程序什么时候给管道写数据了,我应该什么时候读呢?
版主能否给我写个简单的示例?谢谢
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
给个例子:
附件: 只有本站会员才能下载或查看附件,请
举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
等 级:论坛游民
帖 子:33
专家分:26
回复 7楼 东海一鱼
谢谢你的例子。
虽然跟我想要的需求还有点距离,有些测试命令没有相应的输出而是弹出命令行窗口运行。
好好研究一下你的示例,谢谢。
等 级:论坛游民
专家分:17
正需要这方面的例子。
以前都是用WinExec,一直搞不懂CreateProcess怎么用。
明天好好把你这个例子运行分析一下。多谢分享。
等 级:新手上路
木马程序里大都有吧,拨出来就是了
版权所有,并保留所有权利。
Powered by , Processed in 0.058718 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights ReservedC++如何编程调用命令行程序?谢谢
[问题点数:40分,结帖人volitanthorse]
C++如何编程调用命令行程序?谢谢
[问题点数:40分,结帖人volitanthorse]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2010年5月 Linux/Unix社区大版内专家分月排行榜第二2009年11月 Linux/Unix社区大版内专家分月排行榜第二
2010年4月 Linux/Unix社区大版内专家分月排行榜第三2009年10月 Linux/Unix社区大版内专家分月排行榜第三2009年6月 Linux/Unix社区大版内专家分月排行榜第三2008年7月 Linux/Unix社区大版内专家分月排行榜第三2007年12月 Linux/Unix社区大版内专家分月排行榜第三
2015年2月论坛优秀版主
2009年7月 总版技术专家分月排行榜第二2009年3月 总版技术专家分月排行榜第二2009年1月 总版技术专家分月排行榜第二2005年7月 总版技术专家分月排行榜第二2005年5月 总版技术专家分月排行榜第二2005年3月 总版技术专家分月排行榜第二
2009年5月 C/C++大版内专家分月排行榜第三
2011年5月 C/C++大版内专家分月排行榜第二2010年9月 C/C++大版内专家分月排行榜第二
2009年11月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 os.system cmd 的文章

 

随机推荐