Estaba revisando la documentación de la llamada al sistema wait4()
y en su página de manual está escrito
Estas funciones están obsoletas; use
waitpid(2)
owaitid(2)
en programas nuevos.
Entonces, revisé la documentación de waitpid()
y vi que hay una diferencia entre los dos.
waitpid()
hace lo mismo que wait4()
, pero wait4()
, según la página man,
Además, devuelve información de uso de recursos sobre el niño en la estructura señalada por
rusage
.
Las dos llamadas al sistema se definen de la siguiente manera
pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage); pid_t waitpid(pid_t pid, int *status, int options);
Ahora, también leí que hay otra llamada al sistema que hace ese trabajo adicional de obtener el rusage
del niño y es getrusage()
.
Entonces, puedo entender que lo que puede hacer wait4()
, uno puede hacer lo mismo usando una combinación de waitpid()
y getrusage()
.
Pero, lo que no entiendo es que siempre hay una fuerte razón para hacer que una llamada al sistema quede obsoleta. Pero en este caso se siente que la funcionalidad se ha dividido.
waitpid()
y getrusage()
, tengo que verificar los valores devueltos dos veces, lo que no fue el caso de wait4()
.wait4()
para obtener rusage
de un hijo específico, pero waitpid()
daría rusage
de todos sus hijos juntos (si se usa con RUSAGE_CHILDREN
). Eso suena como una sobrecarga adicional si hay más de unos pocos procesos secundarios. ¿Por qué se hizo obsoleto wait4()
? Parece que hizo las cosas más difíciles.
Es una cuestión de estandarización e historia. wait4
es una llamada al sistema 4.3BSD, pero POSIX.1 retuvo waitpid
.
Tomado de http://pubs.opengroup.org/onlinepubs/009695399/functions/wait.html :
The waitpid() function shall be equivalent to wait() if the pid argument is (pid_t)-1 and the options argument is 0. Otherwise, its behavior shall be modified by the values of the pid and options arguments
por lo que la función waitpid() se proporciona por tres razones:
To support job control To permit a non-blocking version of the wait() function To permit a library routine, such as system() or pclose(), to wait for its children without interfering with other terminated children for which the process has not waited
Y también incluye todas las habilidades anteriores de wait() como se explica