NOMBRE¶
setpgid, getpgid, setpgrp, getpgrp - obtener/establecer el grupo de procesos
SINOPSIS¶
#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid);
pid_t getpgid(pid_t pid);
int setpgrp(void);
pid_t getpgrp(void);
DESCRIPCIÓN¶
setpgid pone el ID del grupo del proceso especificado por
pid a
pgid. Si
pid es cero, se emplea el PID del proceso en curso. Si
pgid es cero, se emplea el PID del proceso especificado por
pid.
Si
setpgid se utiliza para mover un proceso de un grupo de procesos a
otro (como hacen algunos shells cuando crean tuberías), ambos grupos de
procesos deben formar parte de la misma sesión. En este caso,
pgid especifica el grupo de procesos existente en el que vamos a
entrar, y el ID de sesión de ese grupo de procesos debe coincidir con
el ID de sesión del proceso que quiere entrar.
getpgid devuelve el ID del grupo de proceso del especificado por
pid. Si
pid es cero, se emplea el PID del proceso en curso.
La llamada
setpgrp() es equivalente a
setpgid(0,0).
De manera similar
getpgrp() es equivalente a
getpgid(0). Cada
grupo de procesos es miembro de una sesión y cada proceso es miembro de
la sesión de la que su grupo de procesos es miembro.
Los grupos de proceso se emplean para la distribución de señales,
y por las terminales para arbitrar peticiones para su entrada: los procesos
que tienen el mismo grupo de proceso que la terminal son en primer plano y
pueden leer, mientras que otros se bloquearán con una señal si
intentan leer.
Estas llamadas se usan pues por programas como
csh(1) para crear grupos
de proceso cuando implementan el control de trabajos. Las llamadas
TIOCGPGRP y
TIOCSPGRP descritas en
termios(3) se emplean
para obtener/poner el grupo de proceso de la terminal de control.
Si una sesión posee una terminal controladora, CLOCAL no está
configurada y si se cierra la sesión, entonces se enviará una
señal SIGHUP al lider de sesión. Si el lider de sesión
existe, se enviará la señal SIGHUP a cada proceso del grupo de
procesos en primer plano de la terminal controladora.
Si la terminación del proceso hace que un grupo de procesos se quede
huérfano y si cualquier miembro del grupo de procesos que se acaba de
quedar huérfano se detiene, entonces se enviará una señal
SIGHUP seguida de una señal SIGCONT a cada proceso en el grupo de
procesos que se acaba de quedar huérfano.
VALOR DEVUELTO¶
En caso de éxito,
setpgid y
setpgrp devuelven cero. En caso
de error. devuelven -1 y ponen un valor apropiado en
errno.
getpgid devuelve un grupo de proceso si acaba bien; -1 en caso de error,
y pone un valor apropiado en
errno.
getpgrp siempre devuelve el grupo de proceso actual.
ERRORES¶
- EINVAL
- pgid es menor que 0 ( setpgid, setpgrp).
- EACCES
- Se intentó cambiar el identificador de grupo de procesos de uno de
los hijos del proceso invocador y el proceso hijo ya había
realizado una llamada a execve ( setpgid,
setpgrp).
- EPERM
- Se intentó cambiar el grupo de procesos de un proceso a otro grupo
en una sesión diferente, o cambiar el identificador de grupo de
procesos de uno de los hijos del proceso invocador estando el proceso hijo
en una sesión diferente, o cambiar el identificador de grupo de
procesos de un líder de sesión ( setpgid,
setpgrp).
- ESRCH
- Para getpgid: pid no concuerda con ningún proceso.
Para setpgid: pid no se corresponde con el proceso actual ni
con uno de sus hijos.
Las funciones
setpgid y
getpgrp siguen el estándar POSIX.1.
La función
setpgrp es de BSD 4.2. La función
getpgid conforma con SVr4.
OBSERVACIONES¶
POSIX tomó
setpgid de la función BSD
setpgrp. SysV
también tiene una función con el mismo nombre, pero es
idéntica a
setsid(2).
Para obtener los prototipos bajo glibc, debe definir tanto _XOPEN_SOURCE como
_XOPEN_SOURCE_EXTENDED, o usar "#define _XOPEN_SOURCE
n" para
algún entero
n mayor o igual a 500.
VÉASE TAMBIÉN¶
getuid(2),
setsid(2),
tcgetpgrp(3),
tcsetpgrp(3),
termios(3)