Sind STDIN_FILENO und STDOUT_FILENO Lesen nur in c?
fd = open("/dev/null", O_RDWR);
if (fd == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
"open(\"/dev/null\") failed");
return NGX_ERROR;
}
if (dup2(fd, STDIN_FILENO) == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed");
return NGX_ERROR;
}
if (dup2(fd, STDOUT_FILENO) == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed");
return NGX_ERROR;
}
if (fd > STDERR_FILENO) {
if (close(fd) == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");
return NGX_ERROR;
}
}
man
sagt mir, dass dup2() makes newfd be the copy of oldfd, closing newfd first if necessary.
:
int dup2(int oldfd, int newfd);
Aber nicht STDIN_FILENO
und STDOUT_FILENO
nur Lesen?
Dump of assembler code for function dup2:
0x00000037aa4c6ac0 <dup2+0>: mov $0x21,%eax
0x00000037aa4c6ac5 <dup2+5>: syscall
0x00000037aa4c6ac7 <dup2+7>: cmp $0xfffffffffffff001,%rax
0x00000037aa4c6acd <dup2+13>: jae 0x37aa4c6ad0 <dup2+16>
0x00000037aa4c6acf <dup2+15>: retq
0x00000037aa4c6ad0 <dup2+16>: mov 0x28a4d1(%rip),%rcx # 0x37aa750fa8 <free+3356736>
0x00000037aa4c6ad7 <dup2+23>: xor %edx,%edx
0x00000037aa4c6ad9 <dup2+25>: sub %rax,%rdx
0x00000037aa4c6adc <dup2+28>: mov %edx,%fs:(%rcx)
0x00000037aa4c6adf <dup2+31>: or $0xffffffffffffffff,%rax
0x00000037aa4c6ae3 <dup2+35>: jmp 0x37aa4c6acf <dup2+15>
Oder dup2
nicht ändern newfd
überhaupt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Konstanten, die sich (auf POSIX,
STDIN_FILENO
ist0
undSTDOUT_FILENO
ist1
) sind in der Tat nur gelesen, sondern die Datei-Deskriptoren, die Sie charakterisieren, geschlossen werden kann, und etwas anderes eröffnet an Ihrer Stelle; Sie sind nur gewöhnliche Datei-Deskriptoren (in der Regel mit einer Flagge gesetzt, so dass Sie offen bleiben, auf eineexecve()
system call).Die Sache, die sich ändert, ist die Tabelle der Dateideskriptoren, die für den Prozess befindet sich in der OS-kernel. Sehen, dass
syscall
Anleitung? Das ist wirklich wichtig hier; das ist die Falle, aus der Sie Ihren Prozess in dem OS.if (fd > STDERR_FILENO)
vorclose(fd)
bedeuten?STDERR_FILENO
als2
, und alle anderen FDs sind "kleine" ganze zahlen, die größer sind als das.fd = open("/dev/null", O_RDWR);
hierfd
nie eines von stdin,stdout und stderr,richtig?dup2()
zu replizieren, die FD ausopen()
als Deskriptor, die Sie wollen.if (fd > STDERR_FILENO)
vorclose(fd)
ist sinnlos:)#if 0
.Dies ist der Letzte Teil der daemonizing und beinhaltet umleiten
stdout
undstdin
zu/dev/null
weil Sie nicht gehen, um später verwendet werden.Daemons, normalerweise schreiben auf log-Dateien, die nicht auf die standard-Ausgabe.
Unter Berufung auf dieser Artikel:
/dev/null
ist ein no-op, während des Schreibens aufstdout
erfordert mehr Arbeit und blockieren kann (obwohl die Ausgabe nicht sichtbar, da der Prozess wurde getrennt von dem terminal).Schließen von stdin und stdout funktioniert einwandfrei. Obwohl, wenn Sie dies tun, kann nicht aus Ihnen Lesen mehr-und haben die dup()'d Deskriptoren.