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