Por lo general, ejecutamos comandos en una ventana de terminal / tty / command en el sistema Linux. Si ejecutamos ls -l, sabemos que en realidad ejecutamos un archivo llamado ls ubicado /bin. La ruta completa es /bin/ls.

Se habla mucho sobre la canalización en el sistema * nix-like. ¿Cuál es el archivo ejecutable exacto ubicado en el sistema correspondiente a |? Incluso si la función de canalización está integrada en el sistema, debe encontrarse un fragmento de código. No puedo encontrar documentación sobre eso. No es muy fácil recoger las respuestas de la página de resultados de Google.

He leído información básica sobre la creación de canalizaciones o algo relacionado con la programación de canalizaciones en lenguaje C. Esos se ven muy diferentes del comportamiento de |. ¿El operador de tubería ("|") en el shell está haciendo lo mismo que describen los ejemplos en los libros de programación de primaria C?

Además del |, carácter de canalización, ¿cuáles son los archivos correspondientes para > y <?

Actualización 1: Después de obtener algunas respuestas de sus publicaciones a continuación, creo que mi esqueleto original del mecanismo de tubería se llama "tubería falsa" de http://www.linfo.org/pipe.html

0
gfan 10 sep. 2018 a las 05:39

4 respuestas

La mejor respuesta

Los caracteres <, >, >>, | no son procesos en el mismo sentido que los ejecutables como ls. Más bien, son instrucciones para el shell que modifican las formas en que se crean otros procesos.

Primero, tenga en cuenta que, independientemente de cómo escriba sus comandos de Linux, en realidad no está interactuando directamente con el sistema operativo Linux. Está utilizando un programa llamado shell, muy probablemente /bin/bash, pero hay varios programas shell disponibles, la mayoría de los cuales funcionan de la misma manera básica. El objetivo principal de un shell es interpretar su entrada para iniciar otros procesos. Esto implica la llamada al sistema Linux fork (o posiblemente {{X2} }) para crear un nuevo proceso como proceso hijo del proceso de shell, seguido de la llamada al sistema { {X3}} para que ese proceso hijo cargue y ejecute el programa especificado con los argumentos especificados.

El intérprete de comandos puede hacer varios bits de interpretación en la entrada para determinar cuál será el programa y los argumentos reales, como sustituir alias de comandos, sustituir variables de entorno y expandir ~, * y {{X2} } caracteres. Del mismo modo, los símbolos <, >, >> y | tienen un significado especial para el shell, pero en lugar de modificar el nombre o los argumentos ejecutables, modifican exactamente cómo Se crea el proceso hijo.

Un proceso de Linux normalmente comienza con tres "identificadores de archivo" abiertos: entrada estándar, salida estándar y error estándar. De manera predeterminada, los procesos secundarios del shell utilizarán la misma entrada / salida / error que el shell, lo que significa que pueden obtener información del teclado a través del mismo mecanismo que el shell, y la salida del proceso aparece en la misma ventana. Cuando se utilizan las instrucciones de redirección <, > y >>, el shell modificará los identificadores de archivo para el proceso entre fork y execve de modo que incluso antes de que el ejecutable se inicie en el elemento secundario, uno o más de sus identificadores de archivo predeterminados leerán / escribirán en los archivos nombrados.

Cuando se usa el carácter "pipe" |, el shell iniciará dos procesos secundarios aproximadamente al mismo tiempo, pero con la salida del primer proceso conectada a la entrada del segundo proceso. Esto implica la llamada al sistema pipe, para crear un par de identificadores de archivo donde escribir en un identificador solo coloca los datos en la memoria del sistema operativo hasta que se leen desde el otro identificador.

Así por ejemplo,

grep 'MAGIC' file1.txt | sort

(no necesariamente en este orden):

  1. Crear un par de identificadores de archivo de tubería
  2. Cree un proceso secundario para el comando grep.
  3. Reemplace el controlador de archivo de salida estándar del niño para usar el extremo de escritura de la tubería.
  4. Comience el comando grep a través de execve.
  5. Cree un proceso secundario para el comando sort.
  6. Reemplace el identificador de archivo de entrada estándar del niño para usar el extremo de lectura de la tubería.
  7. Comience el comando sort a través de execve.
  8. Espere a que finalice el proceso secundario sort.

En términos de "incluso si la función de canalización se construye en el sistema, debe encontrarse un fragmento de código", encontrará el código para interpretar estos caracteres especiales de shell en el código para el programa de shell.

4
aschepler 10 sep. 2018 a las 03:15

Los caracteres a los que se refiere son operadores de shell , no archivos ejecutables (por ejemplo, archivos binarios como /bin/ls, también conocido como < em> utilidades externas ).

Es decir, estos caracteres le indican al shell cómo coordinar la ejecución de comandos (utilidades externas, componentes integrados del shell, funciones, alias) y redirigir su entrada / salida .

  • | es una instancia de un operador de control de shell , que encadena la ejecución de múltiples comandos en un pipeline .

  • < y > son operadores de redireccionamiento de shell para redirigir la entrada stdin y la salida stdout , respectivamente.

Si su shell es bash, consulte man bash o, más generalmente, man $SHELL.

5
mklement0 10 sep. 2018 a las 03:16

No hay archivo para | o <. Esos se implementan dentro del shell. Lo mismo ocurre con if, for, while, etc. No se pudo implementar como un ejecutable porque | conecta los ejecutables instruyendo al shell qué debe hacer con sus entradas y salidas.

4
niqueco 10 sep. 2018 a las 02:50

La canalización es no un ejecutable, sino una forma de tener entre procesos comunicación (en tuberías). Es una característica esencial (como muchas otras, incluidos archivos, directorios y procesos) proporcionada por el kernel de Linux. La llamada al sistema relevante es pipe (2), y el pipe (7) ofrece más explicaciones.

Se necesita un libro completo (al menos) para responder a su pregunta. Entonces no podemos responder aquí. Pero estoy dando algunas referencias:

Lea un libro sobre programación de Linux, como el viejo ALP (descargable gratuitamente; tiene varios capítulos relacionado con su pregunta) o algo más nuevo. Consulte también la lista de syscalls (2).

Luego lea un libro sobre sistemas operativos. Recomiendo Sistemas operativos: tres piezas fáciles ( descargable libremente; nuevamente tiene varios capítulos relacionados con su pregunta).

Por lo tanto, debe pasar varios días o semanas leyendo.

Su shell está utilizando pipe (2) para interpretar {{ X0}}. Para redirecciones como > o < usa < a href = "http://man7.org/linux/man-pages/man2/dup2.2.html" rel = "nofollow noreferrer"> dup2 (2) o dup. Por supuesto, un shell utiliza fork (2) para crear procesos , waitpid (2) o similar para esperarlos, y execve (2) para ejecutar programas. Globbing (ver glob (7)) requiere escanear directorios con opendir (3), readdir (3) etc. y consultar metadatos de archivos con stat (2)... cd tiene que ser un shell incorporado y utiliza chdir (2).

Por lo tanto, también debe leer más sobre shells de Unix (y una buena manera de entenderlos es escribe tu propio pequeño shell en C; este es un ejercicio muy común e interesante).

Por cierto, la mayoría de los shells de Unix son software gratuito. Podrías estudiar su código fuente. El sash es un poco defectuoso, pero es pequeño (y muy básico!) y su fuente es bastante legible. Por supuesto, conchas prácticas reales como bash, zsh, pescado tienen muchas más funciones (la mayoría de ellas por conveniencia), por lo que son más complejos, pero aún puede estudiar su código fuente ya que son software libre.

3
Basile Starynkevitch 10 sep. 2018 a las 04:09