No creo entender completamente lo que está preguntando ... Agregue alguna explicación.
Pero por lo que creo que entiendo, no .
Una analogía podría ser:
Si miro a la Persona A y veo con quién hablan, ¿puedo determinar la intención de la Persona A?
En este caso, esa respuesta es bastante turbia. Es posible que pueda ver que la Persona A habla con alguna persona importante en la aplicación de la ley, y tal vez con algunas personas asociadas con el crimen organizado. Pero va a ser extremadamente difícil (¿imposible?) Declarar con certeza los motivos de la Persona A. ¿Son policías encubiertos o delincuentes con un juez bajo el pulgar?
No se puede leer nada confiablemente en tal conocimiento solo.
Si lograra obtener más información, como la E / S que se está realizando, entonces estaría en camino de comprender la situación con mayor claridad.
En otras palabras, si observa cada archivo (representado por descriptores de archivo en un orden respectivo como 0-X), ¿le dirá la naturaleza del proceso y / o subprocesos?
Creo que estás algo confundido acerca de lo que es un " descriptor de archivo ". Un descriptor de archivo se identifica mediante un número simple ( int
): el valor de retorno de open()
... pero dentro del núcleo un descriptor de archivo tiene información asociada. Ver struct file
.
Creo que la respuesta sería sí, si de hecho, todo el proceso realmente está hecho solo de estos archivos.
Esto también tiene alguna evidencia de mala comprensión. Un proceso no está " hecho solo de estos archivos ", sino que está accediendo a estos archivos en este momento . Podemos mostrar esto ejecutando lo siguiente:
$ ls -l /proc/self/fd
total 0
lrwx------ 1 attie attie 64 May 20 15:20 0 -> /dev/pts/3
lrwx------ 1 attie attie 64 May 20 15:20 1 -> /dev/pts/3
lrwx------ 1 attie attie 64 May 20 15:20 2 -> /dev/pts/3
lr-x------ 1 attie attie 64 May 20 15:20 3 -> /proc/13103/fd
Como @grawity ha señalado en un comentario, open()
devolverá el siguiente descriptor de archivo gratuito, llenando los vacíos desde cero. Lo que ves arriba es una instantánea de los archivos que están abiertos actualmente y que cambiarán con el tiempo.
No puede ver el ls
binario en la lista anterior, ni ninguna de sus dependencias inmediatas:
$ ldd $(which ls)
linux-vdso.so.1 => (0x00007fff569ef000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007feeb33df000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007feeb31d7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007feeb2e0e000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007feeb2bd0000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007feeb29cc000)
/lib64/ld-linux-x86-64.so.2 (0x00007feeb361a000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007feeb27c6000)
Cuando intenta " ejecutarls
", el enlazador es en realidad lo que lee los archivos de la biblioteca para clasificar y "enlazar" la imagen completa del proceso. Cuando ls
comienza a ejecutarse, estos datos ya están en la memoria y los archivos ya no están "abiertos".
Algunas aplicaciones pueden hacer uso de 'complementos' o cargar 'dinámicamente' archivos adicionales que brindan funcionalidad (ver dlopen()
), pero este es un caso extremo y está lejos del comportamiento típico: ninguno de los procesos que se ejecutan actualmente en mi máquina tiene un objeto compartido ( *.so
) archivo abierto.
En resumen, y aún de acuerdo con mi respuesta original, no .
No hay una forma definitiva de determinar el comportamiento de un proceso al observar qué archivos tiene abiertos.
En cuanto a determinar la naturaleza de un subproceso, esto es imposible: ¿puede observar init
y determinar la configuración de tiempo de ejecución completa de un sistema? No se .