Bueno, sobre el punto 1, decir que me centraba en si realmente había una espera activa consumiendo la CPU. Tal como está el código, eso solamente ocurre si falla el fork() o si falla el exec(), en cuyo caso, de todas formas, la función sirve de bien poco.
Sobre el segundo punto, decir que no me parece en absoluto que sean lo mismo y la única diferencia sea el tipo. Tampoco estoy de acuerdo en que una diferencia de tipo no sea ninguna diferencia. Lo es desde el punto de vista semántico y desde el de la corrección, y no es lo mismo poner un puntero NULL en un argumento a waitpid(), por ejemplo, que una variable de tipo int que contenga un 0. Aparte de que NULL no es lo mismo que (void *) 0 y ya está, sino que está definido como tal. El código que asuma que NULL es 0 es por definición no portable. Quiero decir que no es lo mismo 0 que (void *) 0 ni que NULL, porque el puntero nulo, en principio, no tiene por qué ser (void *) 0. Por suerte o por desgracia la posibilidad de que NULL pueda variar es ínfima, porque existen varias dependencias sobre el valor de NULL, primero por el propio lenguaje en el que es muy común ver cosas como "if (pointer)", y muchísimo código dejaría de funcionar si se cambiase su valor, y segundo porque no conviene que el puntero nulo apunte a una zona usable de memoria.
Es más, lo desconozco, pero es posible que ya en el propio estándar de C se garantice que NULL es (void *) 0 por estas razones.
Re:Aprendiendo a programar...
(Puntos:2)( http://www.flawedcode.org/ )
Sobre el segundo punto, decir que no me parece en absoluto que sean lo mismo y la única diferencia sea el tipo. Tampoco estoy de acuerdo en que una diferencia de tipo no sea ninguna diferencia. Lo es desde el punto de vista semántico y desde el de la corrección, y no es lo mismo poner un puntero NULL en un argumento a waitpid(), por ejemplo, que una variable de tipo int que contenga un 0. Aparte de que NULL no es lo mismo que (void *) 0 y ya está, sino que está definido como tal. El código que asuma que NULL es 0 es por definición no portable. Quiero decir que no es lo mismo 0 que (void *) 0 ni que NULL, porque el puntero nulo, en principio, no tiene por qué ser (void *) 0. Por suerte o por desgracia la posibilidad de que NULL pueda variar es ínfima, porque existen varias dependencias sobre el valor de NULL, primero por el propio lenguaje en el que es muy común ver cosas como "if (pointer)", y muchísimo código dejaría de funcionar si se cambiase su valor, y segundo porque no conviene que el puntero nulo apunte a una zona usable de memoria.
Es más, lo desconozco, pero es posible que ya en el propio estándar de C se garantice que NULL es (void *) 0 por estas razones.
Sí, /me usa -pedantic. xD
Unix have fun [barrapunto.com]