Newsgroup: it.comp.os.linux.development
Titolo: scrivere su stdin di un altro programma

Ciao a tutto il newgroup, ho una domanda da fare:
cè modo per un programma di scrivere sullo stdin di un altro programma che
è già in esecuzione ? se sì, come (in C) ?
Grazie tutti

 cheè già in esecuzione ? se sì, come (in C) ?
/proc/$(pid)/fd/0
-- 
HappyCactus - Linux User #209744 - 
http://pngstego.sourceforge.net
 
              pngstego 0.3.2 has been released! 
/* Ci sono 10 categorie di persone al mondo: quelle che capiscono */
/* il sistema binario e quelle che non lo capiscono.              */

 /proc/$(pid)/fd/0
 
Credevo fosse un'ottima idea, però l'ho appena provato e non funziona :\
Qualunque cosa scrivo su 0, 1 o 2 appare sul terminale dove ho lanciato
il programma, ma non viene inviato al programma stesso.
(infatti)
bash-2.05a$ ls -l
total 0
lrwx------    1 mtc      mtc            64 Mar  1 01:13 0 -> /dev/pts/4
lrwx------    1 mtc      mtc            64 Mar  1 01:13 1 -> /dev/pts/4
lrwx------    1 mtc      mtc            64 Mar  1 01:13 2 -> /dev/pts/4
Altre idee ?

cheè già in esecuzione ? se sì, come (in C) ?
se il programma non fosse in esecuzione, potresti usare pipe() o
popen(). altrimenti, afaik, devi usare altri metodi: un socket unix
penso sia la soluzione migliore. crei /tmp/sockxyz e un processo legge e
l`altro scrive. questo ti permette anche di superare la limitazione
della popen(), che su alcuni sistemi operativi ( linux ) e` implementata
come flusso unidirezionale, mentre su altri ( freebsd ) e`
bidirezionale.
man 2 socket :)
ciao :)
-- 
:wq

 Altre idee ?
Immagino tu non possa controllare il metodo di esecuzione del programma,
vero?


 vero?
 
Allora, espongo il problema completo. Il programma a cui vorrei inviare
stringhe sullo stdin è mplayer, lanciato in modalità -slave. 
dal manuale:
 -slave
              This  option  switches  on slave mode.  This is in-
              tended for use of MPlayer as  a  backend  to  other
              programs.  Instead of intercepting keyboard events,
              MPlayer will read simplistic command lines from its
              stdin
ed infatti se sul terminale dove l'ho lanciato scrivo ad esempio
"pause" mplayer mette in pausa la riproduzione del filmato.
A me serve scrivere un programma che controlli tramite stringhe inviate
sullo stdin di mplayer la riproduzione dei filmati.
qualche idea su come fare ?

 qualche idea su come fare ?
Fai un programma che lancia mplayer come figlio e dialoga con lui mediante
pipe.
Questo programma potra' comandare direttamente player o inviare i comadi
letti, per esempio da socket o named pipe.
Alessandro.

 qualche idea su come fare ?
penso che
man 3 popen
possa fare al tuo caso
esempio:
<code>
#include <iostream>
#include <stdio.h>
#include <string>
int main() {
         FILE* cat_stdin=popen("cat > log.txt","w");
         std::string in_buffer;
         std::getline(std::cin,in_buffer);
         fwrite(in_buffer.c_str(),in_buffer.length(),1,cat_stdin);
         pclose(cat_stdin);
}
</code>
ciao

 sullo stdin di mplayer la riproduzione dei filmati.
popen() ?
-- 
There are only 10 kinds of people in the world --
Those who understand binary, and those who don't.