/ / Por que o pclose (3) não espera terminar o comando shell - c, linux, popen, pclose

Por que o pclose (3) não espera o comando shell terminar - c, linux, popen, pclose

Eu quero testar o pclose (3) se vai esperar o comando shell terminar. Eu escrevo dois pequeno programa shell.

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

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

programa c:

//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;
}

então, compile: $ gcc -o ptest ptest.c

Em seguida, execute o ptest (meu computador é Ubuntu 12.04.3 LTS):

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

este teste vai espere o shell terminar e status de saída de saída 0.No entanto quando eu executo o ptest da seguinte forma:

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

desta vez, não espere o programa shell e termine-se imediatamente, eu acabei de adicionar uma declaração de eco antes do sono, mas o resultado foi diferente. Eu não sei por quê.

Respostas:

1 para resposta № 1

exit status:141 é um SIGPIPE erro. Está bem explicado nesta questão Por que sair do código 141 com grep -q?

A questão é que o seu b.sh script tenta escrever para o pipe, mas ninguém está lendo esse pipe no seu programa em C.