Consola Virtual de Linux (3): terminal, descriptor de archivo, los argumentos de línea de comandos / opciones, tubo, filtro, prueba condicional, y presentar utilidad de archivo

Hay tantas utils archivo archivo / restauración / comprimir bajo Linux, como cp, tar, cpio, dd, gzip, rsync, instalar, etc A veces, su sintaxis de línea de comandos son, en el mejor confuso. Una mejor comprensión de las cosas bajo el capó le ayudará a aumentar su productividad y disminuir la posibilidad de estragos causados ​​por la operación de error.

1. argumento de línea de comando / opción.

Si usted comienza un comando en el shell, todo el argumento de comandos se almacenará en una región de memoria justo encima de la cima de la pila, en un arreglo igual manera. De menor a la dirección de memoria superior, tenemos «argc, argv [0], argv [1] ….. NULL». Después de eso, se guardan todas las variables de entorno. Puede comprobar la línea de comandos de un proceso que se ejecuta en / proc / $ {} procid / cmdline:

gcc @ :/ luke-debian proc / self $ gato-A-b-E-s
akjdf
1 akjdf $
akdjf
2 akdjf $

En otro terminal,
luke luke @ debian: ~ $ pgrep cat
4570
luke luke @ debian: ~ $ cat / proc/4570/cmdline
gato-Abes l

Seguramente puede acceder a todos los parámetros de líneas de comandos en función principal en un entorno hospedado libc:
int main (int argc, char * argv []);
2. tabla de descriptores de archivo
En el entorno Linux / Unix, muchas operaciones de dispositivo se proporcionan a través de interfaz de archivo. Por ejemplo, puede acceder a archivos normal, dispositivo de caracteres (puerto serie, terminal (pty), UART, etc), dispositivo de bloques (/ dev / sda, / dev/sda1), conector de red (inet / unix), tubo, memoria compartida , el parámetro kernel (/ proc), árbol de dispositivos (/ sys), etc, etc Cuando un proceso en espacio de usuario para acceder a estos cuál dispositivo / capacidad, él necesidad de abrir un «archivo» a través de «apertura / Crear «syscall y operar el correspondiente dispositivo / capacidad a través de la adquirida» descriptor de fichero «. Cada proceso tiene una «tabla de descriptores de archivo» el registro de todos los descriptores de archivos abiertos para este proceso. Cuando el proceso funciona en estos descriptores de archivo, una syscall se emite al kernel linux con este descriptor de fichero (un entero). En el kernel, hay una «tabla de archivos abiertos del sistema.» Usando el identificador de proceso y el archivo descriptor proporcionada por syscall como índice, kernel buscará en el sistema de la tabla de archivos abiertos, y encontrar el dispositivo en bruto este descriptor de fichero corresponde a, y operar en el dispositivo correspondiente. Los diferentes descriptores de archivos dentro de un proceso o entre diferentes fuerzas proceso último punto con el mismo dispositivo sin formato en tablas de sistema de archivos abiertos. Esa es la situación en la que un dispositivo se comparte entre procesos o aparatos con diferentes capacidades y procesos de abrirlo a través de diferentes parámetros, entonces adquiere diferentes descriptores de archivo para las diferentes operaciones de usuario.

descriptores de archivo de un proceso se exporta a través de «/ proc / $ {procid} / fd». He aquí un ejemplo:
gcc @ luke-debian: ~ $ ping www.google.com


64 bytes de hkg03s13-in-f17.1e100.net (173.194.127.145): icmp_req = 2 ttl = 52 tiempo = 51,1 ms
64 bytes de hkg03s13-in-f17.1e100.net (173.194.127.145): icmp_req = 3 ttl = 52 tiempo = 53,8 ms

Courier New, Courier, monospace; font-size: x-small;»> 64 bytes desde hkg03s13-in-f17.1e100.net (173.194.127.145): icmp_req = 5 ttl = 52 tiempo = 49,4 ms

64 bytes de hkg03s13-in-f17.1e100.net (173.194.127.145): icmp_req = 6 ttl = 52 tiempo = 49,5 ms

gcc @ luke-debian: ~ $ pgrep de ping

30281


[sudo] password para gcc:

Courier New, Courier, monospace; font-size: x-small;»> lrwx —— 1 root root 64 22 de enero 17 : 46 0 -> / dev/pts/2

lrwx —— 1 root root 64 22 de enero 17:46 2 -> / dev/pts/2

lrwx —— 1 root root 64 22 de enero 17:46 3 -> socket: [604612]

Podemos ver fd «0/1/2» todos los puntos a la terminal «/ dev/pts/2 «. Este dispositivo es en realidad la pseudo-terminal (PTS2). fd «3» se apunta a la toma de red abierta a través de «ping».
Para el dispositivo terminal, fd 0 es «stdin», una de sólo lectura fd, fd 1 es «stdout «, una de sólo escritura fd, y FD 2 es» stderr «, también es una de sólo escritura fd. Nos vemos aquí un caso típico de un proceso abre un «dispositivo en bruto» (pts / 2) de tres maneras diferentes y adquiere 3 fd. Cuando un proceso se ejecuta en un shell, el fd 0/1/2 siempre estará a cargo de la cáscara de los padres, si bien podrían apuntar a diferentes dispositivos en bruto si shell padre hacer la redirección de stdin / out. En el caso normal, todas apuntan al control del terminal de sesión de grupo de proceso actual.

Hay más información detallada acerca de estos fd abierto bajo «/ proc / $ {} procid / fdinfo:
gcc @ luke-debian: ~ $ sudo ls-l / proc/30281/fdinfo
total de 0
-r ——– 1 root root 0 22 de enero 17:53 0
-r ——– 1 root root 0 22 de enero 17:53 1
-r ——– 1 root root 0 22 de enero 17:53 2
-r ——– 1 root root 0 22 de enero 17:53 3

gcc @ luke-debian: ~ $ sudo cat / proc/30281/fdinfo/0

0

banderas: 0100002
gcc @ luke-debian: ~ $ sudo cat / proc/30281/fdinfo/1

0

banderas: 0100002
gcc @ luke-debian: ~ $ sudo cat / proc/30281/fdinfo/2

0

banderas: 0100002
gcc @ luke-debian: ~ $ sudo cat / proc/30281/fdinfo/3

0

banderas: 02
Podemos ver las «banderas» podrían ser diferentes, que en la mayoría de los casos refleja la forma de abrir el dispositivo en bruto. Dado que todos los fds aquí se refieren a una corriente (terminal o corriente de red), por lo que no se pronuncia (pos) se mantiene. Usted no puede hacer lectura / escritura aleatoria de flujo en serie, por lo que la posición actual no tiene sentido aquí.

Hay un linux util «lsof» lo que le ahorrará un montón de tiempo en que el examen de un proceso de abrirse descriptor de fichero fd Para recopilar información de ping-como se mencionó anteriormente, se puede hacer:. />

uke @ mediocre debian: ~ $ pgrep-x de ping | xargs-L 1-n 1-t sudo lsof + fg + L-p
sudo lsof + fg + L-p 16403
COMANDO PID NLINK USUARIO FD FILE TYPE-FLAG DISPOSITIVO TAMAÑO / OFF ; nombre de nodo
ping-16403 lucas cwd ; DIR 8,3 4096 70 1318208 / home / luke
ping 16.403 luke rtd DIR 8,3 4096 25 2 /
ping 16.403 luke txt REG 8,3 36136 1 3670109 / bin / ping
ping-16403 lucas mem REG 8,3 10880 1 2228295 / lib/libnss_mdns4.so.2
ping 16.403 luke mem REG 8,3 80712 1 2360118 / lib/x86_64-linux-gnu/libresolv-2.13.so
ping 16.403 luke mem REG 8,3 22928 1 2360081 / lib/x86_64-linux-gnu/libnss_dns-2.13.so
ping-16403 lucas mem REG 8,3 9800 1 2228296 / lib/libnss_mdns4_minimal.so. 2
ping-16403 lucas mem REG 8,3 47616 1 2360083 / lib/x86_64-linux-gnu/libnss_files-2.13.so
ping-16403 lucas mem REG ; 8,3 1595408 1 2360011 / lib/x86_64-linux-gnu/libc-2.13.so
ping 16.403 luke mem REG 8,3 136936 1 2359989 / lib/x86_64-linux-gnu/ld-2.13.so
CHR de ping 16.403 luke 0u RW, LG 136,3 0T0 1 6 / dev/pts/3
CHR ping-16403 lucas 1u RW, LG 136,3 0T0 1 6 / dev / pts / 3
ping-16403 lucas 2u CHR RW, LG 136,3 0T0 1 6 / dev/pts/3
ping-16403 lucas 3u RW prima 0T0 34161 00000000:0001 -> 00000000:0000 jersey = 07

El «FD / TIPO / FILE-FLAG / DISPOSITIVO / TAMAÑO / OFF / NODO / NOMBRE «le dirá casi toda la información acerca de fd.» man lsof «para obtener información más detallada referencia.

3. Terminal

Cada proceso en primer plano tendrá un terminal con destino a la misma, por lo que el usuario puede interactiva con el proceso que se ejecuta a través del terminal (teclado, monitor). Según el caso normal, proceso en primer plano tendrá fd 0/1 / 2 apuntan a este terminal, tal como lo hace su proceso padre (una concha). Proceso sin terminal de control son normalmente los procesos del servidor, y se ejecuta en segundo plano sin interacción del usuario. Para el proceso normal del usuario, al cerrar la sesión y el terminal está privado de ella, el núcleo va a generar una «SIG_HUP» señal a todos los niños el proceso de esta shell. Por defecto, el manejador de la señal «SIG_HUP» en el proceso terminará el proceso. Así que después de la sesión, todos los niños procesos de empezar en el shell terminará por defecto
Puede comprobar un terminal de proceso a través de «tty» o «ps»:.

Courier New, Courier, monospace; font-size: x-small;»> PID TTY TIEMPO CMD

17239 pts / 2 00:00:00 fiesta
20540 pts / 2 00:00:00 ps
gcc @ luke-debian: ~ $ tty
/ dev/pts/2

4. filtrar
«hacer una cosa y hacerla bien» es una filosofía de desarrollo de aplicaciones Unix. Muchas tradicional utils en Unix realmente hacen una cosa así. En la línea de comandos, puede gasoducto estas utils para realizar la operación bastante sofisticada. Por ejemplo,
Courier New, Courier, monospace; font-size: x-small;»> gcc @ luke-debian: ~ / t $ ps-ef> ps.txt

Courier New, Courier, monospace; font-size: x-small;»> gcc @ luke-debian: ~ $ cat

hola

me

Courier New, Courier, monospace; font-size: x-small;»> mundo

mundo

cat

aquí se acaba de repetir lo que se escribe (stdin) para supervisar (stdout);
gcc @ luke-debian: ~ $ cut-d:-f 2
a: b: c
b

Courier New, Courier, monospace; font-size: x-small;»>

2

. Aquí corte cortará las cadenas que ponen a través de la entrada estándar y el eco a la salida estándar el segundo elemento
gcc @ luke-debian: ~ $ sort
pila
iphone
bueno

blue; font-family: Courier New, Courier, monospace; font-size: x-small;»> buena

iphone
pila

entro en algunas palabras consola, a continuación pulsar «ctrl-d», más o menos seria de las palabras ordenadas de nuevo a la consola.
gcc @ luke-debian: ~ $ wc
hola hackers de Linux
1 3 22

entro en una frase después haga clic en «ctrl-d», wc me dirá las palabras números carac línea / / vía de salida a la salida estándar (consola)
Ahora vamos hasta la tubería hacia arriba:
gcc @ luke-debian: ~ $ cat | sort | tee sorted.txt | wc
iphone

Courier New, Courier, monospace; font-size: x-small;»> manzana

3 3 19

Courier New, Courier, monospace; font-size: x-small;»> manzana

hola
iphone

5 canalización anónima
Pipe es un mecanismo previsto en linux para la comunicación entre procesos Cuando se utiliza. «|» en la línea de comandos para concatenar «filtro» de aplicaciones, en realidad es . una canalización anónima que conecta la salida estándar de aguas arriba y aguas abajo stdin Wikipedia tiene muy buen puesto en el tubo, no puedo dudar en referencia a su diagrama de ilustración aquí:
http://en.wikipedia.org/wiki/Pipeline_ (Unix)

program1 | program2 | programa3

Tengamos un cheque de detalle a anónimo tubería

luke luke @ debian:. ~ $ pstree-sunpl 28535
init(1)───wmiirc(28335,luke)───gnome-terminal(28336)───bash(28535)─┬─cat(15180)
└ ─ camiseta (15181)
luke luke @ debian: ~ $ ps-o cmd, pid, sid, pgid-s 28535
CMD ; PID SID pgid
cat 15180 28535 15180
tee My.txt 15181 28535 15180
fiesta 28535 28535 28535
luke luke @ debian: ~ $ lsof + fg-g 28535,15180 | grep ‘FIFO | CHR ‘
cat 15180 15180 0u luke CHR RW, LG 136,2 0T0 5 / dev/pts/2
cat 15180 15180 lucas 1w FIFO ; 0,8 W 0T0 241529 tubería
cat 15180 15180 lucas 2u CHR RW, LG 136,2 0T0 5 / dev/pts/2
camiseta 15181 15180 lucas 0r FIFO 0,8 0T0 241529 tubería
tee 15.181 15.180 luke 1u CHR RW, LG 136,2 0T0 5 / dev/pts/2
camiseta 15181 15180 lucas 2u CHR ; RW, LG 136,2 0T0 5 / dev/pts/2
fiesta 28535 28535 lucas 0r CHR RW, LG 136,2 ; 0T0 5 / dev/pts/2
fiesta 28535 28535 lucas 1w CHR RW, LG 136,2 0T0 5 / dev / pts / 2
fiesta 28535 28535 lucas 2w CHR RW, LG 136,2 0T0 5 / dev/pts/2
fiesta 28535 28535 lucas 255u CHR RW, LG, 0x80000 136,2 ; 0T0 5 / dev/pts/2

Podemos ver el «gato» ‘s stdout y «tee» ‘s la entrada estándar se han conectado a través de una canalización anónima «FIFO 241529».

6. tubería con nombre

pips Anonymous es un objeto transitorio que desaparecerá después de los procesos crearon salida. Una tubería con nombre se crea fuera del alcance de los procesos que la utilizan. Algunas pruebas siguen:

Courier New, Courier, monospace; font-size: x-small;»> gcc @ luke-debian: ~ / t $ file myfifo

Courier New, Courier, monospace; font-size: x-small;»>

Courier New, Courier, monospace; font-size: x-small;»> 111 333

444

Courier New, Courier, monospace; font-size: x-small;»> gcc @ luke-debian: ~ / t $ cat > myfifo

bbb

ccc» font-family: Courier New, Courier, espacio sencillo; font-size: x- pequeña; «> ddd

init(1)───sshd(2943)───sshd(5441)───sshd(5446,gcc)───bash(5447)───cat(5448)

http://en.wikipedia.org/wiki/Process_substitution
http://tldp.org/LDP/abs/html/process-sub.html

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *