2010-06-30 9 views
6

Est-il possible dans Linux de lire en quelque sorte la sortie (de stdout et stderr) d'un autre processus sans qu'il ne le sache? Disons donc que j'ai un processus en cours d'exécution en arrière-plan et que le processus B veut lire sa sortie - est-ce possible? Je ne peux pas utiliser de tuyaux ou le programme d'écran. J'ai essayé de lire depuis/proc/xxx/fd ou depuis/pts/x consoles et ainsi de suite, mais rien n'a fonctionné jusqu'ici.Linux: puis-je lire la sortie d'un autre processus sans utiliser d'IPC (pipes, etc.)?

+0

Avez-vous regardé des choses comme LD_PRELOAD ou ptrace? – ezpz

Répondre

1

Dans le noyau je suppose que vous pourriez écrire un pilote qui accroche les lectures et les écritures pour obtenir ce que vous voulez.

Dans l'espace utilisateur, vous pouvez compiler une glibc modifiée qui se déconnecte de la sortie stdout & stderr vers un fichier avec le processus et l'ID de thread par exemple. Mais c'est risqué si vous cassez quelque chose. (En supposant que les applications que vous voulez tracer ne sont pas liés statiquement ou faire syscalls directement au noyau)

-1

En utilisant simplement la dup2 fonction:

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

Je lis l'implication de votre question que vous êtes pas sur le point d'écrire du code noyau, et que l'idée n'est pas de modifier l'exécutable que vous espionnez. Etant donné ces contraintes, la réponse est simple. Non tu ne peux pas. Le processus appelle write (1, ou write (2, et ceux-ci pourraient aller n'importe où, et il n'y a aucune disposition d'écoute électronique intégrée au système pour vous aider à voir le trafic en cours.)