La primitive fork()

Fermé
lakrib - 12 déc. 2007 à 23:13
 likma - 26 déc. 2007 à 21:19
Bonjour,

au secour........
je voudrais programmer la primitive fork() en c mai je ne sais par ou commencer
je sais que fork() fait une duplication du programme en creant un processsus fils qui va executer le meme concurence que lui
le probleme complet se trouve sur cet adresse : http://www.liafa.jussieu.fr/~yunes/systemes/annales/isterix/
merci de me donner un coup de main
svp c tres important pour moi , c un projet a rendre dans 15 jour

2 réponses

Bonjour, je suis espagnol et je n'ecris pas bien mais le programme est universelle.

El probreme c'est que seulment compile en linux (ubuntu, fedora, ...).

example_fork.c:
-------------------

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
int pid;

printf("Hasta aquí hay un único proceso...\n");
printf("Primera llamada a fork...\n");

/* Creamos un nuevo proceso. */
pid = fork();

if (pid == 0) {
printf("HIJO1: Hola, yo soy el primer hijo...\n");
printf("HIJO1: Voy a pararme durante 60 seg. y luego terminaré...\n");
sleep(60);
}
else if (pid > 0) {
printf("PADRE: Hola, soy el padre. El pid de mi hijo es: %d\n",pid);

/* Creamos un nuevo proceso. */
pid = fork();
if (pid == 0) {
printf("HIJO2: Hola, soy el segundo hijo...\n");
printf("HIJO2: El segundo hijo va a ejecutar la orden 'ls'...\n");
execlp("ls","ls",NULL);
printf("HIJO2: Si ve este mensaje, el execlp no funcionó...\n");
}
else if (pid > 0) {
printf("PADRE: Hola otra vez. Pid de mi segundo hijo: %d\n",pid);
printf("PADRE: Voy a esperar a que terminen mis hijos...\n");
printf("PADRE: Ha terminado mi hijo %d\n",wait(NULL));
printf("PADRE: Ha terminado mi hijo %d\n",wait(NULL));
}
else
printf("Ha habido algún error al llamar por 2ª vez al fork\n");
}
else
printf("Ha habido algún error al llamar a fork\n");
return 0;
}

Per Windows, la alternative est CreateProcess.

example_createProcess.c:
--------------------------------

#include <stdio.h>
#include <windows.h>

int
main(int argc, char*argv[])
{
char* cmdline;
STARTUPINFO si;
PROCESS_INFORMATION pi;
int i, len;

/* Construir la línea de comando a parir de los parámetros */
len = 0;
cmdline = malloc(1);
cmdline[0] = '\0';
for (i=1 ; i < argc; i++)
{
len += 2 + strlen(argv[i]);
cmdline = realloc(cmdline, len);
strcat(cmdline, argv[i]);
strcat(cmdline, " ");
}

printf("cmdline: \"%s\"\n", cmdline);

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

/* Creamos el proceso hijo. */
if (!CreateProcess(NULL, /* No nombre de modulo (usar linea de ordenes). */
cmdline, /* Linea de ordenas a ejecutar. */
NULL, /* El manejador de proceso no se hereda. */
NULL, /* El manejador de hilo no se hereda. */
FALSE, /* Los manejadores no se heredan. */
0, /* El proceso se crea sin ninguna opcion especial. */
NULL, /* Heredamos el bloque de entorno del padre. */
NULL, /* Usamos el directorio de inicio del padre. */
&si, /* Puntero a estructura STARTUPINFO. */
&pi)) /* Puntero a estructura PROCESS_INFORMATION. */
{
perror ("Imposible crear proceso");
return 1;
}


printf("[Identificador de proceso: %d]\n",pi.dwProcessId);

/* Si la orden se ejecuta en primer plano, debemos esperar a que termine.*/
WaitForSingleObject(pi.hProcess, INFINITE);

CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);

free(cmdline);

return 0;
}

Au revoir.
0
moi aussi je doit faire ce projet. je suis tout seul. est-ce que tu as un groupe?
0