Sto provando a passare i dati dal mio script perl al mio programma c usando una pipe (unidirezionale). Ho bisogno di trovare un modo per farlo senza fare scherzi con i programmi figlio STDIN o STDOUT, quindi provo a creare un nuovo handle e passando il file fd.Perl, come posso creare una pipe per il mio figlio exec'd?
Creo 2 IO :: Maniglie e creo un tubo. Scrivo a un'estremità della pipe e provo a passare il descrittore di file dell'altra estremità della pipe al mio programma figlio che viene eseguito. Trasmetto il descrittore di file impostando una variabile ENV. Perché non funziona? (Non stampa 'ciao mondo'). Per quanto ne so, i descrittori di file e pipe sono ereditati dal bambino quando vengono eseguiti.
Perl script:
#!/opt/local/bin/perl
use IO::Pipe;
use IO::Handle;
my $reader = IO::Handle->new();
my $writer = IO::Handle->new();
$reader->autoflush(1);
$writer->autoflush(1);
my $pipe = IO::Pipe->new($reader, $writer);
print $writer "hello world";
my $fh = $reader->fileno;
$ENV{'MY_FD'} = $fh;
exec('./child') or print "error opening app\n";
# No more code after this since exec replaces the current process
C Programma, app.c (compilato con gcc app.c -o child
):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char ** argv) {
int fd = atoi(getenv("MY_FD"));
char buf[12];
read(fd, buf, 11);
buf[11] = '\0';
printf("fd: %d\n", fd);
printf("message: %s\n", buf);
}
uscita:
fd: 3
message:
Il messaggio non è mai passato attraverso il tubo al programma C. Eventuali suggerimenti?
Non è il mio caso 1-direzionale? Ho solo bisogno di inviare dati al processo exec'd, non i dati allo script perl, questo significa che non ho bisogno di exec per restituire qualcosa. –
@RodrigoSalazar, oops Ho pensato che stavi tentando una comunicazione bidirezionale perché il tuo script Perl stava scrivendo sia su una pipe che leggendo da una pipe. Tutto ciò che serve per una comunicazione direzionale è 'open' con una pipe. –
Se uso open con pipe non significa che i dati che invio a questo handle appariranno come STDIN al processo exec'd? (Non sono sicuro) –