Ich bin neu in der Systemprogrammierung, und passieren Sie durch den popen()
Aufruf. Dies ist ein Code-Snippet der Implementierung popen()
unter Linux.popen() Aufruf auf Linux, was diese Zeilen tun?
dup2()
Aufruf wird das Argument später schließen, und das vorherige Argument wird explizit in Kind geschlossen. Sieht so aus, als wären beide Deskriptoren im Kind geschlossen.
Warum funktioniert dieses Ding noch? Ich kann die Funktionsweise des Codes nicht verstehen.
switch (pid = vfork()) {
case -1: /* error */
(void) close(pdes[0]);
(void) close(pdes[1]);
return (NULL);
/* NOTREACHED */
case 0: /* child */
if (*type == 'r') {
if (pdes[1] != fileno(stdout)) {
(void) dup2(pdes[1], fileno(stdout));
(void) close(pdes[1]);
}
(void) close(pdes[0]);
} else {
if (pdes[0] != fileno(stdin)) {
(void) dup2(pdes[0], fileno(stdin));
(void) close(pdes[0]);
}
(void) close(pdes[1]);
}
execl("/bin/sh", "sh", "-c", program, NULL);
Dank @Antti. Klar mit dem Konzept jetzt. –