Передача данных в дочерний процесс через системный вызов pipe (): как имитировать нажатие клавиши ввода (при вводе) в терминале? - PullRequest
0 голосов
/ 26 января 2019

Существует программа, которая считывает логин и пароль постепенно. Моя программа вызывает этот и перенаправляет ее ввод через системный вызов pipe (). Это работает так:

int main(void)
{
    int pipes[2];
    pipe(pipes);
    pid_t pid = fork();
    if (!pid)
    {
        close(pipes[1]); // close write-descriptor
        dup2(pipes[0], 0); // copy read-descriptor to 0, hence replace standard input with our pipe descriptor.
        execl(...);
    }
    else if (pid > 0)
    {
        close(pipes[0]);
        ...
        write(pipes[1], "username\n", 9); // transfer username (here is a problem)
        write(pipes[1], "password\n", 9); // transfer password (and here is one)
    }
    else
    { ... }
    return 0;
}

И логин, и пароль прочитаны в переменной логина в вызываемой программе. Я предполагаю, что вызванная программа читает так:

read(0, buff_login. 1024);
...
read(0, buff_password, 1024);
...

Если мы запустим эту программу в терминале и нажмем кнопку ввода после входа в систему, в вызываемой программе системный вызов read () возвращает управление программой и записывает в буфер все, что было передано как ввод ..., а затем вызывает второе чтение () для чтения пароля.

Как я могу имитировать это поведение из моей программы с дескрипторами каналов? Потому что если я запишу символ '\ n' в дескриптор канала, это не повлияет на системный вызов read () в вызываемой программе, и он продолжит чтение в буфере входа в систему.

1 Ответ

0 голосов
/ 26 января 2019

Если кому-то интересно, как я могу это исправить: решение ставит sleep (1) между двумя вызовами write ().

...