在c中使用popen运行多个命令

时间:2014-04-25 09:09:30

标签: c linux popen

我使用C创建程序,该程序在需要运行多个命令的linux环境中运行

sudo -s

LS

PWD

(假设sudo -s下的命令是需要超级用户才能运行的命令)

现在,我需要做的是获取这些命令的所有输出以供进一步处理。 这是代码

int executeCommand(char *command, char *result)
{
    /*This function runs a command./*/
    /*The return value is the output of command*/

    int nSuccess = -1;
    FILE * fp = NULL;
    char buffer[1035];

    if (command == NULL)
        render("Command is null");

    if (result == NULL)
        render("result is null");
    if (command!=NULL && result!=NULL)
    {
        fp=popen("sudo -s","w");
            fwrite ( " ls", 1, 3, fp);
            fwrite ( " pwd", 1, 4, fp);
        if(fp!=NULL)
        {
            strcpy(result,"\0");
            while(fgets(buffer, sizeof(buffer)-1,fp)!=NULL)
            {
                strcat(result,buffer);
            }
            pclose(fp);
        }   nSuccess=0;

    }

    return nSuccess;
}

问题是我如何能够执行ls和pwd然后获得它的输出?谢谢:))

1 个答案:

答案 0 :(得分:0)

从形式上讲,你的帖子中没有任何问题,但是

  1. 如果您的问题是ls并且pwd未执行sudo -s:请尝试向fwrite()添加换行符(就像您输入的那样)你的shell也是):

     fwrite ( "ls\n", 1, 3, fp);
     fwrite ( "pwd\n", 1, 4, fp);
    

    (命令之前的" "不是必要的)

  2. 在检查fwrite()

  3. 之前请勿致电fp
  4. 如果您致电fp=popen("sudo -s","w");,则无法使用fp进行阅读。 while(fgets(buffer, sizeof(buffer)-1,fp)!=NULL)无法工作。如果你想管道命令 sudo 想要读取输出,你需要两个管道,这会让事情变得复杂一点,或者你可以重定向sudo输出到临时文件,然后读取:

    char tmpfile[L_tmpnam];
    char cmd[1024];
    tmpnam( tmpfile );
    sprintf( cmd, "sudo -s >%s", tmpfile );
    fp = popen( cmd, "w" );
    ....
    pclose(fp);
    
    FILE *ofp = fopen( tmpfile, "r" );
    if( rfp != null ) {
        while(fgets(buffer, sizeof(buffer)-1,rfp)!=NULL)
        {
            strcat(result,buffer);
        }
        fclose( rfp );
        remove( tmpfile );
    }