manual de unix iv

Upload: is-ra

Post on 30-Oct-2015

54 views

Category:

Documents


0 download

TRANSCRIPT

DOCTORADO EN INFORMTICA

DOCTORADO EN INFORMTICA

PROGRAMACIN DE SISTEMAS UNIX:COMUNICACIN ENTRE PROCESOS

NDICE.

1. PROCESOS.

1. Conceptos generales.

2. Ejecucin de comandos.

1. Subrutina system.

2. Subrutinas exec.

3. Creacin de procesos.

1. Subrutina fork.

2. Subrutinas wait y waitpid.

4. Terminacin de un proceso.

1. Subrutina exit.

2. Subrutina atexit.

2. SEALES.1. Conceptos generales.

2. Lista de las seales ms importantes.

3. Capturar seales.

1. Subrutina signal:

2. Subrutina sigaction:

3. Subrutina kill:

4. Alarmas y temporizadores.

1. Subrutinas alarm y ualarm:

5. Tratamiento de errores.

1. Lista de errores ms importantes.

2. Subrutina perror:

3. PIPES (TUBERAS).1. Conceptos generales.

2. Redireccin.

1. Subrutinas dup y dup2:

2. Subrutina fcntl:

3. Comunicacin entre procesos emparentados.

1. Subrutina pipe

4. Comunicacin entre procesos no emparentados.

1. Subrutina mkfifo:

Lista de programas.

system.c - Listar los procesos del usuario usando system.

exec.c - Listar los procesos del usuario usando exec.

fork.c - Ejecucin conjunta de procesos padre e hijo.

fork_huerf.c - Ejemplo de proceso hurfano.

waitpid.c - Esperar la terminacin de un proceso hijo.

atexic.c - Ejecucin de una rutina al salir de un programa.

signal.c - Contar el nmero de CTRL-C en 15 segundos.

kill.c - Ejecucin con tiempo de espera usando kill.

alarm.c - Esperar una alarma.

dup2.c - Redireccin usando dup2.

pipe.c - Tubera sin nombre entre procesos padre e hijo.

pipe_conec.c - Tubera entre 2 comandos usando pipe.

lector_fifo.c - Tuberia con nombre usando mkfifo.

escritor_fifo.c - Tuberia con nombre usando mkfifo.

fifo - Carga los procesos lector y escritor en 2o plano.

1. PROCESOS.

1,1. Conceptos generales.

Proceso:

programa o comando en ejecucin.

Caractersticas:

Un proceso consta de cdigo, datos y pila.

Los procesos existen en una jerarqua de rbol (varios Hijos, un slo padre).

El sistema asigna un identificador de proceso (PID) nico al iniciar el proceso.

El planificador de tareas asigna un tiempo compartido para el proceso segn su prioridad (slo root puede cambiar prioridades).

Ejecucin en 1er plano:

proceso iniciado por el usuario o interactivo.

Ejecucin en 2o plano:

proceso no interactivo que no necesita ser iniciado por el usuario.

Demonio:

proceso en 2o plano siempre disponible, que da servicio a varias tareas (debe ser propiedad del usuario root).

Proceso zombi:

proceso parado que queda en la tabla de procesos hasta que termine su padre. Este hecho se produce cuando el proceso padre no recoge el cdigo de salida del proceso hijo.

Proceso hurfano:

proceso en ejecucin cuyo padre ha finalizado. El nuevo identificador de proceso padre (PPID) coincide con el identificador del proceso init (1).

1,2. Ejecucin de comandos.

1,2,1. Subrutina system:

- Descripcin:

Llamada a un intrprete para ejecutar un comando.

El proceso espera a que finalice la ejecucin de la subrutina y devuelve la salida del programa ejecutado.

- Formato:

#include

int system (cadena)

const char *cadena;

- Parmetro:

cadena - Comando a ejecutar.

- Devuelve:

Estado de salida del programa ejecutado. -1 o 127 en caso de error.

- Comentarios:

a) Se crea un proceso hijo (fork) y se lanza (exec) /usr/bin/bsh, que interpreta el comando a ejecutar.

b) Si la llamada se hace con camino seguro, la orden exec ejecuta el intrprete /usr/bin/tsh.

c) Se ignoran las seales SIGINT y SIGQUIT y se bloquea la seal SIGCHLD.

d) La salida de system no afecta a la salida de los procesos hijos del proceso ejecutor.

- Ejemplo:

/* system.c - Listar los procesos del usuario usando system. */

#include

#include

int main ()

{

int salida;/* Salida del comando */

char comando[100];/* Comando a ejecutar */

printf ("Ejemplo de system.\n");

sprintf (comando, "/bin/ps -fu %s", getenv ("USER"));

salida = system (comando);

printf ("Salida del comando: %d\n", salida);

exit (salida);

}

Ejemplo de system.

USER PID PPID TTY CMD

ramon 3638 1 hft/0 -ksh

ramon 10089 10600 hfp/0 /bin/ps -fu ramon

ramon 10600 11623 hft/0 bsh bsh bsh

ramon 11623 3638 hft/0 system.e

Salida del comando: 0

Suponiendo que no existe el comando MUSHO y sustituyendo la ejecucin de system por la siguiente lnea, se obtiene la salida mostrada a continuacin.salida = system ("MUSHO BETI");

Ejemplo de system.

bsh: MUSHO: no encontrado.

Salida del comando: 256

1,2,2. Subrutinas exec>:

- Descripcin:

Ejecuta un nuevo programa en el mismo proceso.

Se crea un proceso imagen sustituyendo el programa actual por el nuevo.

- Formatos:

#include

int execl (camino, arg0 [, arg1, ...] , 0)

const char *camino, *arg0, *arg1, ...;

int execle (camino, arg0 [, arg1, ...] , 0, p_entorno)

const char *camino, *arg0, *arg1, ...;

char *const p_entorno[];

int execlp (fichero, arg0 [, arg1, ...] , 0)

const char *fichero, *arg0, *arg1, ...;

int execv (camino, val_args)

const char *camino;

char *const val_args[];

int execve (camino, val_arg, p_entorno)

const char *camino;

char *const val_args[], *p_entorno[];

int execvp (fichero, val_args)

const char *fichero;

char *const val_args[];

int exect (camino, val_arg, p_entorno)

char *camino, *val_args, *p_entorno[];

- Sufijos:

L - usa lista de parmetros, el ltimo debe ser 0.

V - usa matriz de parmetros generada previamente, el ltimo debe ser 0.

T - trazado del programa con ptrace (en desuso).

E - usa la matriz de variables de entorno.

P - bsqueda utilizando la variable PATH.

- Parmetros:

camino - Camino completo del fichero ejecutable.

fichero - Nombre del fichero ejecutable.

argN - Argumento N-simo.

val_args - Puntero a la matriz de argumentos.

p_entorno - Puntero a la matriz del entorno.

- Devuelve:

-1, en caso de error.

- Comentarios:

a) La rutina principal (main) de un programa C ejecutable recibe los siguientes parmetros:

int main (cont_args, val_args, p_entorno)

int cont_args; /* Contador de argumentos. */

char *val_args; /* Puntero a la matriz de argumentos. */

char *p_entorno; /* Puntero a la matriz del entorno. */

Las variables val_args y p_entorno son similares a las utilizadas en las subrutinas exec.

b) Esta rutina principal llama a una subrutina de iniciacin que construye la variable de entrono. Dicha variable global es accesible desde el programa declarndola de la siguiente manera:

extern char **environ;

Las subrutinas exec que no usan el parmetro p_entorno utilizan la variable environ.

c) Los descriptores de ficheros abiertos se pasan al nuevo proceso imagen, excepto los que tengan activo el bit FD_CLOEXEC (ver fcntl).

d) Las seales capturadas se reasignan a sus acciones por defecto; las ignoradas, continan siendo ignoradas (ver sigaction).

e) Si el nuevo proceso imagen tiene activo el bit SUID, la identificacin efectiva de usuario (EUID) del nuevo proceso toma el valor del identificador del propietario. Idem, si tiene activo el bit SGID.

f) Los identificadores reales de usuario y de grupo (RUID y RGID) mantienen el valor que tenan en el proceso llamador.

g) El prrafo anterior puede aplicarse a ficheros remotos (previa traduccin de los identificadores).

h) El prrafo e) no afecta a las shell-scripts.

i) El proceso nuevo mantiene las siguientes caractersticas del proceso llamador:

Identificadores de proceso (PID), de proceso padre (PPID) y de grupo de procesos (PGID).

Valores de prioridad (nice), de TTY y del bit de trazado.

Directorio actual y directorio raz.

Mscara de ficheros, limites de longitud de ficheros, lmites de recursos.

Tiempos para activar alarmas y subrutinas times.

Identificador de usuario de conexin.

- Ejemplo:

/* exec.c - Listar los procesos del usuario usando exec. */

#include

#include

int main ()

{

int salida;/* Salida del comando */

printf ("Ejemplo de exec.\n");

execl ("/bin/ps", "ps", "-fu", getenv ("USER"), 0);

printf ("Salida del comando: %d\n", salida);

exit (salida);

}

Ejemplo de system.

USER PID PPID TTY CMD

ramon 3638 1 hft/0 -ksh

ramon 10739 3638 hft/0 /bin/ps -fu ramon

Suponiendo que no existe el comando MUSHO y sustituyendo la ejecucin de execl por la siguiente lnea, se obtiene la salida mostrada a continuacin. salida = execl ("MUSHO", "BETI", 0);

Ejemplo de exec.

Salida del comando: -1

1,3. Creacin de procesos.

1,3,1. Subrutina fork:

- Descripcin:

Crea un nuevo proceso (hijo), copia casi exacta del proceso generador (padre).

- Formato:

#include

pid_t fork ();

- Devuelve:

0 al proceso hijo y PID del hijo al proceso padre (-1, si error).

- Comentarios:

a) La versin BSD (en la librera libbsd.a) es:

int vfork ();

b) Atributos que hereda el proceso hijo.

Entorno.

Bit FD_CLOEXEC para cada descriptor de fichero.

Seales capturadas.

SUID y SGID.

Estado de privilegios y prioridades.

Libreras compartidas y segmentos de memoria compartida.

PGID y TTYGID.

Directorio actual y directorio raz.

Mscara y lmites de medida para ficheros.

Eventos y estado de auditora.

Estado de depuracin.

c) Atributos diferenciadores entre padre e hijo:

PID nico.

PPID distintos (el PPID del hijo coincide con el PID del padre).

El proceso hijo tiene su propia copia de los descriptores de fichero del padre, pero comparte con ste un puntero a fichero para cada descriptor del proceso padre.

Bloqueos de proceso, texto y datos no se heredan.

Las subrutinas times se ponen a 0.

Las alarmas pendientes toman su valor inicial.

Se eliminan las seales pendientes para el proceso hijo.

- Ejemplos:

/* fork.c - Ejecucin conjunta de procesos padre e hijo */

#include

#include

main ()

{

printf ("Ejemplo de fork.\n");

printf ("Inicio del proceso padre. PID=%d\n", getpid ());

if (fork() == 0)

{/* Proceso hijo */

printf ("Inicio proceso hijo. PID=%d, PPID=%d\n",

getpid (), getppid ());

sleep (1);

}

else

{/* Proceso padre */

printf ("Continuacin del padre. PID=%d\n", getpid ());

sleep (1);

}

printf ("Fin del proceso %d\n", getpid ());

exit (0);

}

Ejemplo de fork.

Inicio proceso padre. PID=8153

Inicio proceso hijo. PID=6618, PPID=8153

Continuacin proceso padre. PID=8153

Fin del proceso 6618

Fin del proceso 8153

- Ejemplo:

/* fork_huerf.c - Ejemplo de proceso hurfano *

#include

#include

main ()

{

printf ("Ejemplo de proceso hurfano.\n");

printf ("Inicio del proceso padre. PID=%d\n", getpid ());

if (fork () == 0)

{

printf ("Inicio proceso hijo. PID=%d, PPID=%d\n",

getpid (), getppid ());

sleep (1);

printf ("El proceso queda hurfano. PID=%d PPID=%d\n",

getpid (), getppid ());

}

else

printf ("Concinuacin del padre. PID=%d\n", getpid ());

printf ("Fin del proceso %d\n", getpid ());

exit (0);

}

Ejemplo de proceso hurfano.

Inicio proceso padre. PID=11330

Inicio proceso hijo. PID=6467, PPID=11330

Continuacin proceso padre. PID=11330

Fin del proceso 11330

$punto indicativo> El proceso queda hurfano. PID=6467, PPID=1

Fin del proceso 6467

Notas:

En el ejemplo, el proceso padre no espera la finalizacin del proceso hijo y termina antes que ste.

Cuando un proceso queda hurfano, el proceso de iniciacin (init) se convierte en su padre.

Una vez que finaliza el proceso padre, se devuelve el control al intrprete de comandos, de ah que aparezca el mensaje del "punto indicativo". El proceso hijo no deber mandar mensajes a la consola, como ocurre en este ejemplo.

1,3,2. Subrutinas wait y waitpid:

- Descripcin:

Espera a que pare o termine un proceso hijo, permitiendo obtener sus estados de salida.

Una seal no bloqueada o no ignorada puede reactivar el proceso padre.

- Formato:

#include

pid_t wait (estados)

int *estados;

pid_t wait ((void *) 0);

pid_t waitpid (PID, estados, opciones)

pid_t PID;

int *estados, opciones;

- Parmetros:<

PID - PID del proceso o grupo de proceso. Sus valores son:

-1: waitpid acta igual que wait, esperando cualquier hijo.

>0: PID de un proceso hijo determinado.

0: para cualquier hijo con el mismo grupo de procesos que el padre.

id_padre); /* 1, si PID > PPID */

}

else

{

signal (SIGINT, SIG_IGN); /* Ignorar CTRL-C */

while (waitpid (id_hijo, &estado, 0) != id_hijo);

if (WIFSIGNALED (estado))

printf ("El proceso hijo ha recibido la seal %d\n", WTERMSIG (estado));

if (WIFEXITED (estado))

{

printf ("Estado de salida del proceso hijo: %d\n", WEXITSTATUS (estado));

if (WEXITSTATUS (estado) == 1)

printf ("PID hijo > PID padre.\n");

else

printf ("PID padre > PID hijo.\n");

}

printf ("Fin del proceso %d\n", getpid ());

exit (0);

}

Ejemplo de waitpid.

Inicio proceso padre. PID=24213

Inicio proceso hijo. PID=31638, PPID=24213

Fin proceso hijo. PID=31638

Estado de salida del proceso hijo: 1

PID hijo > PID padre

Fin del proceso 24213

La salida siguiente muestra el efecto de generar una seal de interrupcin pulsando [CTRL][C]. Dicha seal provoca la terminacin automtica del proceso hijo, mientras que el proceso padre la ignora (ver signal).

Ejemplo de waitpid.

Inicio proceso padre. PID=7240

Inicio proceso hijo. PID=5705, PPID=7240

^CEl proceso hijo ha recibido la seal: 2

Fin del proceso 7240

1,4. Terminacin de un proceso.

1,4,1. Subrutina exit:

- Descripcin:

Termina la ejecucin de un proceso.

- Formato:

#include

void exit (estado)

int estado;

- Parmetro:

Estado de salida del proceso.

- Comentarios:

a) El proceso de salida de un proceso es el siguiente:

Llamada a la funcin _cleanup para limpiar las reas de E/S.

Llamada a la subrutina especificada en la subrutina atexit.

Llamada a la subrutina _exit para finalizar el proceso.

b) Si _cleanup no puede cancelar las peticiones de E/S asncrona, la aplicacin se bloquea hasta que se completen dichas peticiones.

c) Se cierran todos los descriptores de fichero.

d) Si el proceso padre est en espera (ver wait), se devuelve el valor de los 8 bits menos significativos del estado de salida.

e) Se enva una seal SIGCHLD al proceso padre. La accin por defecto es ignorar esta seal. Si no se ignora, el proceso hijo puede quedar como proceso zombi.

f) La salida de un proceso no provoca la terminacin de sus hijos. El PPID de los hijos ser el PPID del proceso init (1).

g) Se eliminan los bloqueos de ficheros (ver fcntl).

h) Si para un proceso perteneciente a un grupo hurfano, se envan las seales SIGHUP y SIGCONT a cada proceso del grupo de procesos hurfanos.

1,4,2. Subrutina atexit:

- Descripcin:

Ejecuta una determinada funcin antes de la terminacin del proceso.

- Formato:

#include

int atexit (funcin)

void (*funcin) (void);

- Parmetro:

Puntero a la funcin llamada.

- Devuelve:

0: si no hay errores.

- Comentarios:

a) La funcin se ejecuta si se ha completado con xito la subrutina _cleanup.

- Ejemplo: /* atexic.c - Ejecucin de una rutina al salir de un programa */

#include

#include

int bucle=0;

/* Contador de vueltas del bucle */

void salida ();

/* Prototipo de la funcin de salida */

int main ()

{

int n;

atexit (salida);

printf ("Ejemplo de atexit.\n");

for (bucle=1; bucle 30000)

exit (1);

}

exit (0);

}

void salida ()

{

printf ("El bucle ha dado %d vueltas.\n");

printf ("Hasta luega Lucas.\n");

}

Ejemplo de atexit.

1-168382-57583-101134-175155-31051

El bucle ha dado 5 vueltas.

Hasta luego Lucas.

2. SEALES.

2,1. Conceptos generales.

Seal:

Evento que debe ser procesado y que puede interrumpir el flujo normal de un programa.

Capturar una seal:

Una seal puede asociarse con una funcin que procesa el evento que ha ocurrido.

Ignorar una seal:

El evento no interrumpe el flujo del programa. Las seales SIGINT y SIGSTOP no pueden ser ignoradas (ver tabla de seales).

Accin por defecto:

Proceso suministrado por el sistema para capturar la seal (ver tabla de seales).

Alarma:

Seal que es activada por los temporizadores del sistema.

Error:

Fallo o accin equivocada que puede provocar la terminacin del proceso.

Error crtico:

Error que provoca la salida inmediata del programa.

2,2. Lista de las seales ms importantes.

Nm. Nombre Comentarios

1 SIGHUP Colgar. Generada al desconectar el terminar.

2 SIGINT Interrupcin. Generada por teclado.

3 SIGQUIT1 Salir. Generada por teclado.

4 SIGILL1 Instruccin ilegal. No se puede recapturar.

5 SIGTRAP1 Trazado. No se puede recapturar.

6 SIGABRT1 Abortar proceso.

8 SIGFPE1 Excepcin aritmtica, de coma flotante o divisin por cero.

9 SIGKILL1 Matar proceso. No puede capturarse, ni ignorarse.

10 SIGBUS1 Error en el bus.

11 SIGSEGV1 Violacin de segmentacin.

12 SIGSYS1 Argumento errneo en llamada al sistema.

13 SIGPIPE Escritura en una tubera que otro proceso no lee.

14 SIGALRM Alarma de reloj.

15 SIGTERM Terminacin del programa.

16 SIGURG2 Urgencia en canal de E/S.

17 SIGSTOP3 Parada de proceso. No puede capturarse, ni ignorarse.

18 SIGTSTP3 Parada interactiva. Generada por teclado.

19 SIGCONT4 Continuacin. Generada por teclado.

20 SIGCHLD2 Parada o salida de proceso hijo.

21 SIGTTIN3 Un proceso en 2o plano intenta leer del terminal.

22 SIGTTOU3 Un proceso en 2o plano intenta escribir en el terminal.

23 SIGIO2 Operacin de E/S posible o completada.

24 SIGXCPU Tiempo de UCP excedido.

25 SIGXFSZ Excedido el lmite de tamao de fichero.

30 SIGUSR1 Definida por el usuario nmero 1.

31 SIGUSR2 Definida por el usuario nmero 2.

34 SIGVTALRM Alarma de tiempo virtual.

36 SIGPRE Excepcin programada. Definida por el usuario.

Notas sobre la accin por defecto para la seal.

1. Generar un fichero core.

2. Ignorar la seal.

3. Parar el proceso que recibe la seal.

4. Reiniciar o continuar el proceso que recibe la seal.

Las seales comprendidas entre la 37 y la 58 (ambas inclusive) estn reservadas por el sistema.

El rango de seales en el UNIX de Berkeley (BSD) es de 1 a 31.

2,3. Capturar seales.

2,3,1. Subrutina signal:

- Descripcin:

Asocia una accin determinada con una seal.

- Formato:

#include

void (*signal (seal, accin)) ()

int seal;

void (*accn) ();

- Parmetros:

seal: Nmero de seal, excepto SIGKILL.

accin: Puntero a la rutina asociada con la seal o uno de los valores:

SIG_DFL: accin por defecto para dicha seal.

SIG_IGN: ignorar la seal,

- Devuelve:

Valor de la accin anteriormente asociada; -1, en caso de error.

- Comentarios:

a) Existe una versin de la subrutina signal compatible con el UNIX de Berkeley (BSD).

b) No se permiten mscaras de bloqueo de seales y se activa el bit SA_OLDSTYLE (ver >sigaction).

- Ejemplo:

/* signal.c - Contar el nmero de CTRL-C en 15 segundos */

#include

#include

int numcortes=0;/* Contador de CTRL-C */

int enbucle=1;

/* Controlador de salida del bucle de espera */

void alarma ();

/* Captura la seal de alarma SIGALRM */

void cortar ();

/* Captura la seal de interrupcin SIGINT */

int main ()

{

signal (SIGINT, cortar);

signal (SIGALRM, alarma);

printf ("Ejemplo de signal.\n");

printf ("Pulsa varias veces CTRL-C durante 15 segundos.\n");

alarm (15);

while (bucle);

signal (SIGINT, SIG_IGN);

printf ("Has intentado cortar %d veces.\n", numcortes);

printf ("Hasta luego Lucas.\n");

exit (0);

}

void alarma ()

{

signal (SIGALRM, SIG_IGN);

bucle=0;

/* Salir del bucle */

printf ("Alarma!\n");

}

void cortar ()

{

signal (SIGINT, SIG_IGN);

printf ("Has pulsado CTRL-C\n");

numcortes++;

signal (SIGINT, cortar);

}

Ejemplo de signal.

Pulsa CTRL-C varias veces durante 15 segundo.

^CHas pulsado CTRL-C

^CHas pulsado CTRL-C

^CHas pulsado CTRL-C

^CHas pulsado CTRL-C

^CHas pulsado CTRL-C

Alarma!

Has intentado cortar 5 veces.

Hasta luego Lucas.

2,3,2. Subrutina sigaction:

- Descripcin:

Especifica la accin a realizar cuando un proceso recibe una seal.

- Formato:

#include

int sigaction (seal, accin, accin_salida) ()

int seal;

struct sigaction *accn, *accin_salida;

- Parmetros:

seal: Nmero de seal, excepto SIGKILL.

accin: Accin especificada cuando se recibe la seal.

accin_salida: Accin a realizar cuando termine la funcin sigaction.

- Campos de la estructura sigaction:

void (*sa_handler) (); Puntero a la rutina asociada con la seal o uno de los valores:

SIG_DFL: accin por defecto para dicha seal.

SIG_IGN: ignorar la seal.

sigset_t sa_mask; Especifica la mscara de las seales que sern bloqueadas durante la captura de la seal especificada.

int sa_flags;

SA_ONSTACK: La captura de la seal se realiza en una pila de seales en vez de en la pila del proceso.

SA_OLDSTYLE: El parmetro seal se asocia con la acin por defecto (SIG_DFL) antes de llamar a la rutina de captura (no recomendable, la seal puede recurrir).

SA_NOCLDSTOP: Evita que el proceso padre reciba una seal SIGCHLD cuando para el proceso hijo.

- Devuelve:

0, si es correcta; -1, en caso de error.

- Comentarios:

a) Las siguientes funciones pueden ser llamadas sin problemas desde una rutina de captura de seales:

_exit access alarm chdir chmod chown

close creat dup dup2 exec fcntl

fork fstat getegid geteuid getgid getgroups

getpgrp getpid getppid getuid kill link

lseek mkdir mkfifo open pause pipe

readx rename rmdir setgid setpgrp setuid

sigaction sigaddset sigdelset sigfillset sigismember signal

sigpending sigprocmask sigsuspend sleep statx tcdrain

tcflow tcflush tcgetattr tcgetpgrp tcsendbreak tcsetattr

tcsetpgrp time times umask uname unlink

ustat utime write

b) Una vez que una accin est instalada para una seal, contina hasta que haya otra llamada a sigaction o se llame a la subrutina exec, excepto si se ha activado el bit SA_OLDSTYLE.

c) Las seales SIGKILL y SIGSTOP no pueden ser ignoradas.

2,3,3. Subrutina kill:

- Descripcin:

Enva una seal a un proceso.

- Formato:

#include

int kill (proceso, seal)

pid_t proceso;

int seal;

- Parmetros:

proceso: Identificador del proceso o del grupo de procesos que recibir la seal. Puede tomar los siguientes valores:

>0: Identificador de un nico proceso.

0: Procesos cuyo identificador del grupo de procesos sea igual al PID del proceso actual.

0) o PGID (0) o PGID ( 0 && *cad++ != NULL);

return (n > 0);

}

#include

#include

#include

int main ()

{

int descr, longmens, i;

char mensaje[100];

sprintf (mensaje, "Un saludo desde el proceso %d", getpid ());

longmens = strlen (mensaje) + 1;

do

{

/* intentar la conexion */

descr = open ("tuberia", O_WRONLY);

if (descr == -1) sleep (1);

}

while (descr == -1);

for (i=0; i