/ / Por qué el comando de shell pclose (3) no espera terminarse - c, linux, popen, pclose

¿Por qué el comando pclose (3) no espera el comando de shell? C, linux, popen, pclose

Quiero probar el pclose (3) si esperará que termine el comando de shell. Escribo dos pequeños programas de shell.

//a.sh
#!/bin/bash
sleep 3

//b.sh
#!/bin/bash
echo "something"
sleep 3

c programa:

//ptest.c

#include <stdio.h>
#include <sys/wait.h>

int main(int argc, char **argv) {
char *filename = argv[1];
char *mode = argv[2];
FILE *fl = popen(filename, &mode);
int t = pclose(fl);
if(WIFEXITED(t)) {
printf("exit status:%dn", WEXITSTATUS(t));
}
return 0;
}

entonces, compile $ gcc -o ptest ptest.c

luego ejecute el ptest (mi computadora es Ubuntu 12.04.3 LTS):

$ ./ptest "sh a.sh" r
$ exit status:0

esta prueba espere a que termine el shell y el estado de salida de salida 0. Sin embargo, cuando ejecuto el ptest de la siguiente forma:

$ ./ptest "sh b.sh" r
$ exit status:141

esta vez, el ptest no espera el programa de shell y termina de inmediato, solo agrego una declaración de eco antes de dormir, pero el resultado fue diferente. No sé por qué.

Respuestas

1 para la respuesta № 1

exit status:141 es un SIGPIPE error. Está bien explicado en esta pregunta. ¿Por qué salir del código 141 con grep -q?

El problema es que tu b.sh El script intenta escribir en la canalización, pero nadie está leyendo esta canalización en su programa C.