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.)?
Odpowiedz
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)
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*/
}
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.)
Czy spojrzałeś na rzeczy takie jak LD_PRELOAD lub ptrace? – ezpz