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
告诉我,dup2() makes newfd be the copy of oldfd, closing newfd first if necessary.
:STDIN_FILENO和STDOUT_FILENO是否只读取c?
int dup2(int oldfd, int newfd);
但不STDIN_FILENO
和STDOUT_FILENO
只读?
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>
或dup2
没有变化newfd
?
@Donal Fellows,'close(fd)'前的最后一个条件'if(fd> STDERR_FILENO)'是什么意思? – cpuer 2011-06-01 08:02:32
@cpuer:如果它不是stdin,stdout和stderr中的一个,它将测试(并关闭)文件描述符。 POSIX系统的'STDERR_FILENO'为'2',所有其他的FD都是比它小的“小”整数。 – 2011-06-01 08:04:11
@Donal Fellows,但有必要吗? 'fd = open(“/ dev/null”,O_RDWR);'here'fd'永远不会是stdin,stdout和stderr中的一个,对吗? – cpuer 2011-06-01 08:05:50