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.
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.