无法通过写操作打开popen的标准输入

时间:2018-09-08 11:06:22

标签: c stdin popen

我正在尝试为Linux版本的windscribe创建一个GUI,因此我希望通过我的C程序与windscribe CLI进行通信。我选择使用popen。

我可以使用popen(“ command”,“ w”)编写单个命令,但是我想在询问时添加信息,例如在CLI中登录:

10

因此,我保持FILE为打开状态,并使用fput继续发送信息。 我终于写了这个函数:

$ windscribe login
Windscribe Username: myname
Windscribe Password: mypassword

但是当我使用此功能(例如)进行登录时,它的行为不符合我的预期,似乎其他命令丢失了,没有考虑在内。

void write_in_shell_commands(char** commands, int length){
    FILE *fp = NULL;

    // sending first command
    if (length > 0) {
        debug("Writing \"%s\" to shell.", commands[0]);
        fp = popen(commands[0], "w");
    }

    // sending the rest
    if (fp) {
        debug("File successfully opened.");

        for (int i = 1; i < length; i++){
            debug("%s", "Writing to shell.");
            fputs(commands[i], fp);
        }

        pclose(fp);
    } else {
        debug("Operation failed.");
    }
}

我希望程序执行以下操作:

  1. 在外壳中写入cmd1
  2. 在stdin中写入cmd2
  3. 在stdin中写入cmd3

但这实际上发生了

char* cmd1 = "windscribe login";
char* cmd2 = "myname";
char* cmd3 = "mypassword";

char** commands = malloc(3 * sizeof(char*));
commands[0] = cmd1;
commands[1] = cmd2;
commands[2] = cmd3;

write_in_shell_commands(commands, 3);

实际上是在终端中要求输入密码,最终由于凭据错误而失败。

这里实际上发生了什么?我的第二和第三条命令在哪里?我使用了错误的功能吗?

1 个答案:

答案 0 :(得分:0)

cmd1, cmd2, cmd3是指向char的指针。因此,您应该为char的3个指向commands的指针分配内存,这是一个指向char的指针。

char** commands = malloc(3*sizeof(char*));