C⼀C++如何在代码中获取shell命令的输出

2024年11月19日 00:51
有5个网友回答
网友(1):

在windows下面这个的确是需要用管道来实现的

VC6参考代码:

#include

#include

BOOL ExcudeCmd(char *szOutPutBuf,char *szCmdLine)

{

SECURITY_ATTRIBUTES sa; 

HANDLE hRead,hWrite;

sa.nLength = sizeof(SECURITY_ATTRIBUTES); 

sa.lpSecurityDescriptor = NULL; 

sa.bInheritHandle = TRUE; //输出重定向

if (!CreatePipe(&hRead,&hWrite,&sa,0)) 

printf("创建匿名管道失败");

return FALSE; 

STARTUPINFO si; 

PROCESS_INFORMATION pi; 

ZeroMemory(&si,sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO); 

si.hStdInput=hRead;

si.hStdError = GetStdHandle(STD_ERROR_HANDLE);            //把创建进程的标准错误输出重定向到管道输入 

si.hStdOutput = hWrite;           //把创建进程的标准输出重定向到管道输入 

si.wShowWindow = SW_HIDE;

si.dwFlags =STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; 


if (!CreateProcess(NULL, szCmdLine,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi)) 

CloseHandle(hWrite); 

CloseHandle(hRead); 

printf("创建子进程失败"); 

return FALSE; 

else

{

CloseHandle(pi.hProcess);

CloseHandle(pi.hThread);

}

DWORD bytesRead; 

if (!ReadFile(hRead,szOutPutBuf,1000,&bytesRead,NULL)) 

{

printf("读数据失败"); 

return FALSE;

}

CloseHandle(hRead); 

return TRUE;

}


int main()

{

char cmdline[]="cmd.exe /c echo 回显的信息",buf[1000];

ZeroMemory(buf,100);

ExcudeCmd(buf,cmdline);

printf(buf);//buf就是你想要的东西

}

Linux下面就不清楚了

网友(2):

您可以试下类似的代码,popen 函数在 vc6 中对应的应该是 _popen ,pclose 为 _pclose

或者百度 “c++ 获取 system 的输出” 您可以得到很多类似的问题的解决方案。

#include 
#include 

void executeCMD(const char *cmd, char *result)
{
    char buf_ps[1024];
    char ps[1024]={0};
    FILE *ptr;
    strcpy(ps, cmd);
    if((ptr=popen(ps, "r"))!=NULL)
    {
        while(fgets(buf_ps, 1024, ptr)!=NULL)
        {
           strcat(result, buf_ps);
           if(strlen(result)>1024)
               break;
        }
        pclose(ptr);
        ptr = NULL;
    }
    else
    {
        printf("popen %s error\n", ps);
    }
}

int main()
{
        char result[1024];
        executeCMD("find . -name \"A.txt\"", result);
        printf("%s", result );
        return 0;
}

网友(3):

popen,可以执行一个进程,其反回一个文件指针,就可以读取进程执行的结果!

#include 
#include 
#include 

int main()
{
    FILE *pf = popen("ls ./", "r");
    char res[1024];
    fread(res, 1024, 1, pf);
    printf("----%s---\n", res);
    pclose(pf);
    return 0;
}

网友(4):

  示意流程如下:
return_code = system("shell command") ;
if (return_code == 1)
do something ;
else if (return_code == 2)
do something ;
else
do something ;

网友(5):

WINDOWS环境可以用管道