8.2.05

Listado ordenado.

El siguiente programa crea dos procesos hijos. El primer hijo ejecuta el comando "ls -l" y le pasa el resultado al segundo hijo. El segundo hijo ejecuta "sort -n +4" y redirecciona la salida al archivo "lsord.txt".

En otras palabras, el resultado de este programa es el mismo que el de ejecutar la siguiente expresión:

$ ls -l | sort -n +4 > lsord.txt


// Sustituir las "s por mayor y menos
#include "stdio.h"
#include "stdlib.h>
#include "unistd.h>
#include "fcntl.h>
#include "errno.h>
#include "sys/types.h>
#include "sys/wait.h>

int main()
{
int fd[2];
int status;
int fd_salida;

pipe(fd);

if ( (fd_salida=open("lsord.txt", O_WRONLY | O_CREAT | O_TRUNC, 0600)) == -1) {
perror("Error - ");
return -1;
}

if (fork()==0)
{
// El hijo
dup2(fd[1], STDOUT_FILENO);
close(fd[0]);
close(fd[1]);
execlp("ls", "ls ", "-l", NULL);
perror("Exec falló en ls");
exit(-1);
}
if (fork()==0) {
// El otro hijo
dup2(fd[0], STDIN_FILENO);
close(fd[0]);
close(fd[1]);
dup2(fd_salida, 1);
close(fd_salida);
execlp("sort", "sort", "-n", "+4", NULL);
perror("Exec falló en sort");
exit(-1);
}

close(fd[0]);
close(fd[1]);

// El padre espera a que terminen los hijos
status = wait(NULL);
while ( (status != -1) ||
(status == -1 && errno == EINTR))
status = wait(NULL);

exit(0);
}

No comments: