Estoy tomando un curso de sistemas operativos y me está resultando difícil cómo se redirige la entrada con dup2 cuando tienes horquillas. Escribí este pequeño programa para tratar de darle sentido, pero no tuve éxito en pasar la producción de un nieto a un niño. Estoy tratando de imitar el comando de Unix: ps -A | wc -l. Soy nuevo en Unix, pero creo que esto debería contar las líneas de la lista de procesos en ejecución que obtengo. Entonces mi salida debería ser un solo número.¿Cómo se usan el dup2 y el tenedor juntos?
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
char *searchArg = argv[ 1 ];
pid_t pid;
if ((pid = fork()) > 0) {
wait(NULL);
cout << "Inside parent" << endl;
}
else if (pid == 0) {
int fd1[ 2 ];
pipe(fd1);
cout << "Inside child" << endl;
if (pid = fork() > 0) {
dup2(fd1[ 0 ], 0);
close(fd1[ 0 ]);
execlp("/bin/wc", "-l", NULL);
}
else if (pid == 0) {
cout << "Inside grand child" << endl;
execlp("/bin/ps", "-A", NULL);
}
}
return 0;
}
no tengo que en el código anterior, pero aquí es mi conjetura sobre cómo las cosas deben ir hacia abajo:
- Debemos redirigir la salida estándar del comando ps -A (lo que sea generalmente impreso en la pantalla, ¿correcto?) para que el comando wc -l pueda usarlo para contar las líneas.
- Esta salida estándar se puede redirigir utilizando dup2, como dup2 (?, 1) lo que significa redirigir la salida estándar a?. Entonces cierras?
Pregunta: ¿Dónde lo redirecciono? Sé que debería ser uno de los descriptores de archivos, pero ¿dónde debería redirigirse para que wc pueda procesarlo?
- wc de alguna manera recibe la salida estándar.
Pregunta: ¿Cómo recibe wc la salida? A través de un parámetro execlp? ¿O el sistema operativo verifica uno de los descriptores de archivos?
- Ejecutar wc -l.
¿Cuál de estos está cerrado y dejado abierto para que wc reciba y procese la salida de ps? Sigo pensando que esto debe pensarse al revés ya que ps necesita dar su salida a wc ... pero eso no parece tener sentido ya que tanto el niño como el nieto se están procesando en paralelo.
Daniel, gracias por la clara explicación! Una gran ayuda. Estoy obteniendo un resultado ahora, que me muestra las líneas, las palabras y el recuento de caracteres. ¿No debería el argumento "-l" solo mostrarme el recuento de líneas? Además, una pregunta relacionada: estoy accediendo a una máquina Linux a través de una terminal a través de puTTY. Cuando ejecuto ps -A | wc -l en él, obtengo el resultado 145. Supongo que eso significa que hay un total de 145 procesos que probablemente se estén ejecutando. Cuando ejecuto mi programa, obtengo 5 líneas. Cuando ejecuta ps -A a través de execlp en un programa, ¿solo muestra el padre y sus hijos? – ShrimpCrackers
Nm, descubrí que execlp (...) tenía N argumentos correspondientes a arg [0], arg [1], arg [2] ... – ShrimpCrackers
Ah, claro, uy. Sí, debería ser 'execlp ("/usr/bin/wc "," wc "," -l ", NULL);' y de manera similar para 'ps'. –