Próbuję przekazać dane z mojego skryptu Perl do mojego programu c za pomocą potoku (jednokierunkowe). Potrzebuję znaleźć sposób, aby to zrobić bez zakłócania programów potomnych STDIN lub STDOUT, więc próbuję utworzyć nowy uchwyt i przekazać fd.Perl, w jaki sposób mogę utworzyć potok dla mojego egzekwowanego dziecka?
Tworzę 2 IO :: Uchwyty i utworzę rurę. Piszę na jednym końcu potoku i próbuję przekazać deskryptor pliku drugiego końca potoku do mojego programu potomnego, który jest wykonywany. Przekażę deskryptor pliku, ustawiając zmienną ENV. Dlaczego to nie działa? (Nie drukuje "Witaj świecie"). O ile mi wiadomo, deskryptory plików i potoki są dziedziczone przez dziecko po uruchomieniu.
Perl skrypt:
#!/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 Program app.c (skompilowany z 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);
}
wyjściowa:
fd: 3
message:
Komunikat nigdy nie jest przekazywany przez rurę do programu C. Jakieś sugestie?
Czy mój przypadek nie jest jednokierunkowy? Wystarczy wysłać dane do procesu exec'd, a nie dane do skryptu perla, to znaczy, że nie potrzebuję exec, aby zwrócić cokolwiek. –
@RodrigoSalazar, oops Myślałem, że próbujesz komunikować się dwukierunkowo, ponieważ twój skrypt Perla pisząc do fajki i czytając z potoku. Wszystko czego potrzebujesz do komunikacji jednokierunkowej to 'open' z potokiem. –
Jeśli używam otwartego z potokiem, nie oznacza to, że dane wysyłane do tego uchwytu będą wyświetlane jako STDIN do procesu exec'd? (Nie jestem pewien) –