Programacion de procesos en C

Tengo que desarrollar un programa muy sencillo con procesos en C, pero no se muy bien como hacerlo. Necesito vuestra experta ayuda, simplemente quiero pistas de como podría realizarlo.
Abreviando mucho sería algo así:
"El proceso padre lanza 2 procesos. El primero hace x y el segundo y. Sigue pidiendo cadenas has que metamos por teclado la cadena "exit", matando a los 2 procesos."

Hasta el momento he hecho esto:

Código:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>   

void proceso1(){
   //puts(datos_leidos);
   printf("Proceso1");
   //sleep(200);
}

void proceso2 (){
   /*int fich;
   fich=open("fichero", O_RDWR | O_TRUNC, 0644);
   //write(fich,datos_leidos,strlen(datos_leidos));
   close(fich);*/
   printf("Proceso2");
   //sleep(200);
}

int main(){
   pid_t hijo1;
   pid_t hijo2;
   char datos_leidos[40]="";
   int fin=0;
   
   hijo1=fork();
   if(hijo1==0)//si se crea el proceso1
   {
      proceso1();
   }
   else if(hijo1>0)//proceso padre
   {
      hijo2=fork();
      if(hijo2==0)//si se crea el proceso 2
      {
         proceso2();
      }
      else
      {
         printf("soy el padre");
         printf("Introduce datos: ");
         scanf("%s",datos_leidos);
         if(strcmp(datos_leidos,"exit")==0)
//si se mete exit se mata a los hijos
         {
            kill (hijo1, SIGTERM);
            kill (hijo2, SIGTERM);
            return 0;
         }
      }   
   }   
}

Se supone que fork() devuelve 0 si se ha creado bien el proceso, si no, es el padre no?
El problema es que no se como verificar que proceso esta corriendo.

Gracias de antemano por vuestro tiempo
Por curiosidad... eres de la UAL? xD
Aclara un poco lo que quieres decir con verificar, porque no entiendo bien la duda, si ya lo tienes en el código...:

   hijo1=fork();
   if(hijo1==0)//si se crea el proceso1
   {
      proceso1();
   }
   else if(hijo1>0)//proceso padre
   {

Es decir:

int pid;

pid = fork();
if (pid == -1){
   /* error */
}else if (pid == 0)
   /* Proceso hijo */
}else{
   /* Proceso padre */
}
Deberes(TM)

man fork puede ayudarte...
amuchamu escribió:Aclara un poco lo que quieres decir con verificar, porque no entiendo bien la duda, si ya lo tienes en el código...:

   hijo1=fork();
   if(hijo1==0)//si se crea el proceso1
   {
      proceso1();
   }
   else if(hijo1>0)//proceso padre
   {

Es decir:

int pid;

pid = fork();
if (pid == -1){
   /* error */
}else if (pid == 0)
   /* Proceso hijo */
}else{
   /* Proceso padre */
}

El tema es que quiero crear 2 procesos, aparte del padre(main). El problema es que no se si el que se ejecuta es el 1, el 2 o el padre
Es bastante sencillo, sólo tienes que aplicar lo mismo 2 veces. Con lo que te he puesto antes haces un fork() y con el valor devuelto sabes si estás en el hijo o en el padre. Después, eliges en cuál quieres hacer un fork, en el padre o en el hijo, y repites el proceso.

De hecho es lo que tienes en el código que has puesto en tu primer comentario, donde el proceso original hace 2 forks y guarda el pid de los hijos en hijo1 e hijo2.

Me parece que lo que pasa es que no entiendes bien el funcionamiento del fork y lo que ejecuta cada proceso, repasa esos apuntes :P
aselR escribió:"El proceso padre lanza 2 procesos. El primero hace x y el segundo y. Sigue pidiendo cadenas has que metamos por teclado la cadena "exit", matando a los 2 procesos."
printf("soy el padre");
printf("Introduce datos: ");
scanf("%s",datos_leidos);
if(strcmp(datos_leidos,"exit")==0)
//si se mete exit se mata a los hijos
{
kill (hijo1, SIGTERM);
kill (hijo2, SIGTERM);
return 0;
}

Si tienes que seguir pidiendo, tendras que meter un bucle. En lugar del if, un while; mientras no sea exit, que no haga nada, y detras del while, donde solo pasara cuando metas exit, acabas con los procesos, y return.
Espero haberte ayudado.
Un saludo,
He estado haciendolo de nuevo y tengo esto, pero no me funciona y no se porque. Me sale un bucle infinito, si me podeis ayudar, estaría muy agradecido:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>   

void proceso1(){
   printf("Proceso1");
}

void proceso2 (){
   printf("Proceso2");
}

int main(){
   pid_t hijo1;
   pid_t hijo2;
   char datos_leidos[40]="";
   
   printf("Introduce una cadena de texto: ");
   scanf("%s",datos_leidos);

   while(strcmp(datos_leidos,"exit")!=0){
      hijo1=fork();
      if(hijo1==0)
         proceso1();
      else
      {
         hijo2=fork();
         if(hijo2==0)
            proceso2();
         else{
            printf("Introduce una cadena de texto: ");
            scanf("%s",datos_leidos);
         }
      }         
   }
   kill(hijo1,SIGKILL);
   kill(hijo2,SIGKILL);
   return 0;
}
Te explico lo que sucede, pero no estás haciendo lo que te piden, no tienes que hacer forks hasta que metas exit, dentro del while te sobra casi todo, sólo tendrías que pedir la cadena.


El padre llega al while, hace un fork, hace otro fork, pide una cadena.

Mientras tanto, el primer hijo ha ejecutado proceso1, sale del if pero sigue en el while y hace exáctamente lo mismo que su padre, 2 fork y pide una cadena.

El segundo hijo, ejecuta proceso2, sale de los if pero sigue en el while y hace lo mismo que su padre, 2 fork y pedir una cadena.

En este punto tienes 1 padre y 2 hijos, cada hijo con 2 hijos, que van a hacer otros 2 hijos que crearán otros 2 hijos, y todos pararán cuando pidan una cadena de texto, pero siempre creando 2 hijos. No hay forma humana de que puedas escribir exit tan rápido.

Es decir, el padre puede que mate a los primeros hijos, pero cuando lo hayas hecho éstos ya habrán creado cientos de hijos que esperan a que les metas una cadena.
Ok muchas gracias por responder, que no es poco.
Es que es la primera vez que hago cosas de procesos con C, y ando perdidillo. Ya lo miraré y a ver que tal progreso
9 respuestas