Существует программа, которая считывает логин и пароль постепенно. Моя программа вызывает этот и перенаправляет ее ввод через системный вызов 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 () в вызываемой программе, и он продолжит чтение в буфере входа в систему.