Sto provando a eseguire un programma con uno specifico input standard. Riesco utilizzando un file di descrizione di un file in cui v'è quello che voglio mettere in stdin, ma non riesco a scrivere direttamente sullo standard input:execv * e scrivere in stdin
$cat input.test
echo Hello
$
Codice C:
int main(int argc, char **argv)
{
int fd = 0;
fd = open("input.test", O_CREAT);
close(STDIN_FILENO);
dup2(fd, STDIN_FILENO);
char *const args[] = { "bash", NULL };
execvp("bash", args);
}
Quello funziona:
$./a.out
Hello
$
Ma se provo a scrivere direttamente sullo STDIN utilizzando pipe il programma visualizza nulla e mantiene in esecuzione:
int main(int argc, char **argv)
{
int fds[2];
pipe(fds);
close(STDIN_FILENO);
dup2(fds[1], STDIN_FILENO);
write(fds[1], "echo Hello;", 11); // Résults are identics with fds[0]
char *const args[] = { "bash", NULL };
execvp("bash", args);
}
Grazie per il vostro aiuto
Cordialmente, Bastien.
EDIT Problema risolto:
Grazie per le vostre risposte, ecco il codice che funziona:
int main(void)
{
int fd[2];
pid_t pid;
if (pipe(fd) < 0)
return EXIT_FAILURE;
if ((pid = fork()) < 0)
return EXIT_FAILURE;
else if (pid != 0) { /* father */
close(fd[1]);
dup2(fd[0], STDIN_FILENO);
execlp("bash", "bash", (char *)0);
} else { /* son */
close(fd[0]);
write(fd[1], "echo hello\n", 11);
}
return EXIT_SUCCESS;
}
perché stai facendo downvoting agli altri?menti curiose vogliono sapere :) – Will
Non ho idea del perché tutte le risposte siano state downvoted. – Mat