WNOHANG|WUNTRACED vs WNOHANG||WUNTRACED

Buenas!estaba tenia que entregar una práctica a las 9 de la mañana sobre una shell en linux, despues de pasar toda el cuatrimestre me quede toda la noche y lo conseguí xDD, ya está enviada y aprobada. Lo único que me extrañó la atención es que hice un manejador de señales de la shell, para controlar si un proceso en segundo plano intenta leer de terminal se suspendiera, esto pensé en arreglaro poniendo pidh=waitpid(ptr->pid,&status,WNOHANG||WUNTRACED); pero accidentalmente puse pidh=waitpid(ptr->pid,&status,WNOHANG|WUNTRACED); (eliminé una barra del or logico, ||)
el caso es que me funciona, y cuando me doy cuenta del fallo lo arreglo poniendo ||, pero ya no funciona , asi que lo dejé como estaba y la envié XDD.

La cosa es que ya por curiosidad lo intenté sacar (después de haberla enviado claro) y no se porque, la shell la hice en ubuntu con c y posix.

A ver si alguien me saca la duda, saludos a todos!
La forma correcta es "WNOHANG | WUNTRACED". Te explico brevemente cada caso:

Caso 1 (incorrecto):
pidh = waitpid(ptr->pid, &status, WNOHANG || WUNTRACED)


En este caso, el codigo evalua la operacion (WNOHANG || WUNTRACED), la cual devuelve 1 si alguno de dichos valores es distinto de cero (que ambos lo son) o devuelve 0 si ambos valoes son cero. Es decir, que el tercer argumento que le pasas a waitpid va a ser 1 o 0 (en este caso 1). Y 1 quizas equivale, casulamente, al valor de otra flag distinta, o a nada.

Caso 2 (correcto):
pidh = waitpid(ptr->pid, &status, WNOHANG | WUNTRACED)


En este otro caso, el codigo realiza una operacion binaria OR con ambos valores, y el resultado de dicha operacion (que sera un valor numerico formado por la combinacion de los bits 1 de ambas constantes) sera pasado como tercer argumento de waitpid.
1 respuesta