Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/12/2009, 11:39
Hypocrisy
 
Fecha de Ingreso: noviembre-2009
Mensajes: 13
Antigüedad: 14 años, 6 meses
Puntos: 0
ls|more& en C/C++

Buenas, estoy haciendo un programa que haga el ls|more& osea que haga el comando ese pero en segundo plano o background. He estado mirando por la web y en otras web y lo unico que he encontrado es lo como hacer demonios en linux o algo asi....pero no consigo hacerlo.
De momento tengo el codigo para hacer el comando ls| more, pero no consigo hacerlo en segundo plano... Pego el codigo y a ver si alguien me puede hechar un cable.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <signal.h>
  6. #include <fcntl.h>
  7. #include <errno.h>
  8. #include <errno.h>
  9. void error(char *m)
  10. {
  11.       /* Escribe los errores por el canal estándar de errores (2) */
  12.       write(2, m, strlen(m));
  13.       write(2, "\n", 1);
  14.       write(2, strerror(errno), strlen(strerror(errno)));
  15.       exit(1);
  16. }
  17. main()
  18. {
  19.       int p[2];
  20.       int st1, st2;
  21.       /* Se crea una pipe y se reciben los dos canales: */
  22.       /* el de lectura y el de escritura (p[0] y p[1]) */
  23.       if (pipe(p) < 0) error("Creación pipe");
  24.       switch (fork())
  25.       {
  26.  
  27.             case -1: error("Fork 1");
  28.             case 0: /* Hijo 1 - Redirecciona, cierra y ejecuta */
  29.                   /* Redirecciona salida estándar hacia la pipe */
  30.                   close(1); dup(p[1]);
  31.                   /* Cierra los canales de la pipe que no utiliza */
  32.                   close(p[0]); close(p[1]);
  33.                   /* Carga el código de ls con dos parámetreos */
  34.                   execlp("ls","ls", (char *)0);
  35.                   error("Ejecución ls ");
  36.             default: /* Proceso padre */
  37.                   break;
  38.       }
  39.          switch (fork())
  40.          {
  41.                   case -1: error("Fork 2");
  42.                   case 0: /* Hijo 2 - Redirecciona, cierra y ejecuta */
  43.                           /* Redirecciona entrada estándar hacia la pipe */
  44.                           close(0); dup(p[0]);
  45.                           /* Cierra los canales de la pipe que no utiliza */
  46.                           close(p[0]); close(p[1]);
  47.                           /* Carga el código de grep con un parámetro */
  48.                           execlp("more", "more", (char *)0);
  49.                           error("Ejecución grep");
  50.                   default: /* Proceso padre */
  51.                           break;
  52.          }
  53.          /* El padre cierra los canales que no utiliza */
  54.          close(p[0]); close(p[1]);
  55.          /* Espera que acaben los dos hijos */
  56.          wait(&st1);
  57.          wait(&st2);
  58.          /* Finaliza su ejecución */
  59.          exit(0);
  60. }

lo podeis probar...funciona perfectamente.....ahora solo falta que funcione en segundo plano -_--''