C使用popen对数据执行命令

时间:2013-09-14 05:33:13

标签: c winapi unix cmd popen

TL; DR如何将字符串发送到cmd.exe,执行grep / findstr或sort,然后使用popen打印输出?

我有一个客户端和服务器设置。用户输入命令,例如'列表X:| grep name',然后分成'列表X:'和' grep name'。 '列出X:'被发送到服务器,然后服务器执行列表函数并返回包含列表结果的char []。然后,客户端需要将其提供给cmd.exe并执行' grep名称'命令该数据并将其打印给用户。我不需要将数据从cmd返回到客户端进程,只需输出它。

我知道我的代码目前还没有尝试写(我在阅读模式下打开文件)但是我尝试过其他一些东西并且似乎无法发送数据到cmd.exe)

代码如下:

        ...
        int n = recv(clientSocket, reply, sizeof(reply), 0);

        std::string* cmdStr = new std::string(cmd);
        cmdStr->erase(std::remove(cmdStr->begin(), cmdStr->end(), '\n'), cmdStr->end());

        if(cmdStr->compare("") != 0)    //Something to pipe to command
        {
            char pipeBuffer[8192];
            FILE* pipe;

            char c [8192];
            strcat(c, "cmd.exe /C ");
            strcat(c, reply);
            strcat(c, " | ");
            strcat(c, cmdStr->c_str());

            if((pipe = _popen(c, "r")) == NULL)
            {
                printf("Unable to create pipe!\n");
            }

           while(!feof(pipe))
           {
              if(fgets(pipeBuffer, 8192, pipe) != NULL)
              {
                  printf(pipeBuffer);
              }
           }
        }
        ...

2 个答案:

答案 0 :(得分:0)

我最后用这个修复它,以防万一其他人遇到类似的问题:

FILE* pipe;

if((pipe = _popen(cmdStr->c_str(), "w")) == NULL)
{
    printf("Unable to create pipe!\n");
}

fprintf(pipe, "%s", reply);

printf("\nPipe process returned %d\n", _pclose(pipe));

答案 1 :(得分:0)

好吧,如果您的应用程序已经作为控制台运行,您可以使用在CMD上执行命令的函数system(),如果没有,您可以使用AllocConsole()模拟控制台,然后使用系统(),如果你想真正模仿,你可以使用pipes