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 № 1exit 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.