gpt4 book ai didi

c - STDIN_FILENO 和 STDOUT_FILENO 在 c 中只读吗?

转载 作者:行者123 更新时间:2023-12-02 08:54:10 28 4
gpt4 key购买 nike

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() 使 newfd 成为 oldfd 的副本,必要时先关闭 newfd。:

int dup2(int oldfd, int newfd);

但是 STDIN_FILENOSTDOUT_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

最佳答案

常量本身(在 POSIX 上,STDIN_FILENO0 并且 STDOUT_FILENO1)确实被读取了-仅,但它们所表征的文件描述符可能会被关闭,而其他东西会在它们的位置打开;它们只是普通的文件描述符(通常设置了一个标志,以便它们在 execve() 系统调用时保持打开状态)。

发生变化的是驻留在操作系统内核中的进程的文件描述符表。看到 syscall 指令了吗?这在这里真的很重要;那是从您的进程进入操作系统的陷阱。

关于c - STDIN_FILENO 和 STDOUT_FILENO 在 c 中只读吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6197944/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com