您的位置:首页 > 其它

执行命令并获取结果函数

2010-12-02 17:10 344 查看
Windows下:获取cmd命令返回结果



HRESULT CMDEx(LPCTSTR pszCMD, CString &str)
{
    if(pszCMD == NULL || pszCMD[0] == 0)
    {
      return S_FALSE;
    }
    TCHAR szCMD[1024] = {0};
    STARTUPINFO	 si;
    PROCESS_INFORMATION	 pi;
    HANDLE	 hRead, hWrite;
    SECURITY_ATTRIBUTES	 sa = {0, NULL, TRUE};
    //创建匿名管道
    if(!CreatePipe(&hRead, &hWrite, &sa, 0))
    {
        return S_FALSE;
    }
    _stprintf(szCMD, TEXT("cmd.exe /C %.1000s"), pszCMD);
 
    str.Empty();
    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb	 = sizeof(STARTUPINFO);
    si.dwFlags	 = STARTF_USESHOWWINDOW |      STARTF_USESTDHANDLES;
    si.wShowWindow	= SW_HIDE; 
    si.hStdOutput	= hWrite;
    si.hStdError	= hWrite;
    si.hStdInput	= hRead;
    //创建进程执行命令
    if(CreateProcess(NULL, szCMD, NULL, NULL, TRUE, 0,    NULL, NULL, &si, &pi))
    {
         //等待命令执行完成
         WaitForSingleObject(pi.hProcess, INFINITE);
         CloseHandle(hWrite);
         DWORD	dwRet, dwReaded;
         CHAR	szBuf[256] = {0};
         //获取进程执行返回值
         GetExitCodeProcess(pi.hProcess, &dwRet);
         //读取控制台终端输出
      while(ReadFile(hRead, szBuf, 255, &dwReaded, NULL))
        {
           szBuf[dwReaded] = 0;
           str += szBuf;
        }
        if(dwRet != 0)
        {
            str.Insert(0, TEXT("/r/n"));
           str.Insert(0, szCMD);
        }
        CloseHandle(hRead);
        return HRESULT_FROM_WIN32(dwRet);
    }
    else
    {
        CloseHandle(hWrite);
        CloseHandle(hRead);
        return(HRESULT_FROM_WIN32(GetLastError()));
    }
}




linux下:

#include <memory.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>       
                   
//执行系统命令,并获取输出
int mysystem(const char* cmdstring, char* buf, int len)
{           
    int fd[2];//文件描述符
    pid_t pid;//管道
    int n, count;
    memset(buf, 0, len);
    if (pipe(fd) < 0)//建立管道
    return -1;
        
    if ((pid = fork()) < 0)//新建进程
    return -1;//失败的话,返回-1 
    else if (pid > 0)        /* 父进程 */
    {
        close(fd[1]);     /* 关闭写管道 */
        count = 0;
        while ((n = read(fd[0], buf + count, len)) > 0 && count > len)//从管道中读取数据
        count += n;
        close(fd[0]);
        if (waitpid(pid, NULL, 0) > 0)
        return -1;
    }
    else                     /* 子进程 */
    {
        close(fd[0]);        /* close read end */
        if (fd[1] != STDOUT_FILENO)
        {
            if (dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO)//复制文件描述符
            {
                return -1;
            }
            close(fd[1]);
        }
        if (execl("/bin/sh", "sh", "-c", cmdstring, (char*)0) == -1)
        {
            printf("%s failure/n",cmdstring);
            return -1;
        }
        else printf("%s success/n",cmdstring);
    }
    return 0;
}


int systemex(const char* cmdstring, string &info)
{
    if (cmdstring == NULL || cmdstring[0] == 0)
        return EINVAL;

    FILE *fd = popen(cmdstring, "r");
    if (fd != NULL)
    {    
        char buf[1024];

        while (fgets(buf, 1024, fd)) 
        {    
            info += buf; 
        }    

        pclose(fd);
    }    
    else 
    {    
        Log(strerror(errno), "popen");
        return errno;;
    }    

    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: