fclose () / pclose () pode bloquear em alguns ponteiros de arquivo
Chamandofclose()
aqui depoisdup()
seus blocos descritores de arquivos até que o processo filho tenha terminado (presumivelmente porque o fluxo terminou).
FILE *f = popen("./output", "r");
int d = dup(fileno(f));
fclose(f);
No entanto, executando manualmentepipe()
, fork()
, execvp()
dopopen()
, e depoisdup()
o descritor de arquivo de leitura do tubo, o fechamento do original não é bloqueado.
int p[2];
pipe(p);
switch (fork()) {
case 0: {
char *argv[] = {"./output", NULL};
close(p[0]);
dup2(p[1], 1);
execvp(*argv, argv);
}
default: {
close(p[1]);
int d = dup(p[0]);
close(p[0]);
}
}
Por que isso ocorre e como posso fechar oFILE *
retornou depopen()
e usar um descritor de arquivo em seu lugar?
Atualizar:
Estou ciente de que a documentação diz para usarpclose()
, Contudofclose()
blocos também. Além disso, eu cutuquei o código da glibc epclose()
apenas chamafclose()
. O comportamento é o mesmo, sejafclose()
oupclose()
é usado.