2010-06-30 10 views
6

Czy w Linuksie można jakoś odczytać wyjście (ze stdout i stderr) innego procesu, nie wiedząc o tym? Więc powiedzmy, że mam proces A działający w tle, a proces B chce odczytać jego wynik - czy to możliwe? Nie mogę użyć rur ani programu ekranowego. Próbowałem czytać z/proc/xxx/fd lub z/pts/x konsol i tak dalej, ale nic nie działało tak daleko.Linux: czy mogę odczytać dane wyjściowe innego procesu bez użycia żadnego IPC (potoki itp.)?

+0

Czy spojrzałeś na rzeczy takie jak LD_PRELOAD lub ptrace? – ezpz

Odpowiedz

1

W jądrze mogę napisać sterownik, który przechwytuje odczyty i zapisuje, aby uzyskać to, co chcesz.

W przestrzeni użytkownika można skompilować zmodyfikowaną glibc, która wylogowuje wyjście stderr do pewnego pliku wraz z procesem i identyfikatorem wątku na przykład. Ale to ryzykowne, jeśli coś złamiesz. (Zakładając, że aplikacje, które chcemy śledzić nie są powiązane statycznie lub dokonywać bezpośrednich wywołań systemowych do jądra)

-1

po prostu za pomocą dup2 funkcję:

int b_fd; /* This is the B process File descriptor*/ 
int a_fd /* This is the A process File descriptor*/ 

int main (int argc, char*argv[]){ 
    /** I suppose that you can init the file descriptor for A*/ 
    dup2(b_fd, a_fd); 
    /**Now everything that A will output will be written in B file descriptor*/ 

    } 
1

czytam wpływu na swoje pytanie, że jesteś nie zamierzam pisać kodu jądra, a pomysł nie polega na modyfikacji pliku wykonywalnego, który śledzisz.

Biorąc pod uwagę te ograniczenia, odpowiedź jest prosta. Nie, nie możesz. Proces wywołuje zapis (1 lub zapis (2, a te mogą być w dowolnym miejscu i nie ma wbudowanego w system "podsłuchu", który pomoże Ci zobaczyć ruch w drodze.)