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;
}
}
Run Code Online (Sandbox Code Playgroud)
man告诉我dup2() makes newfd be the copy of oldfd, closing newfd first if necessary.: …
我之前一直在使用 freopen (来自 stdio.h)函数,但没有问自己这个问题。但现在我不确定。
例如我重新打开了标准输出:
#define OUTPUT_FILE "out.txt"
if ( freopen(OUTPUT_FILE,"w+",stdout) == NULL)
printf("logout can't be opened\n");
Run Code Online (Sandbox Code Playgroud)
通常每个进程都有并自动处理 stdout、stderr、stdin,我们不需要关心它们的关闭。
但在这里怎么样?我已重新打开标准输出。
我应该调用 fclose 来关闭重新打开的标准输出吗?
PS 我更高兴看到执行此处理的部分代码,而不是听到我可以确信这里一切都很好。
预先感谢您的任何提示。
有没有办法将类型int(文件描述符)的变量强制转换为C中的类型FILE?我有一个开放的管道fd,我想使用期望FILE的函数.
我想从非阻塞 tun/tap 文件描述符中读取 IP 数据包,tunfd
我将其设置tunfd为非阻塞并在 libevent 中为其注册 READ_EV 事件。
当事件被触发时,我首先读取前20个字节以获取IP头,然后读取其余部分。
nr_bytes = read(tunfd, buf, 20);
...
ip_len = .... // here I get the IP length
....
nr_bytes = read(tunfd, buf+20, ip_len-20);
Run Code Online (Sandbox Code Playgroud)
但是对于read(tunfd, buf+20, ip_len-20)
我收到 EAGAIN 错误,实际上应该有一个完整的数据包,所以应该有一些字节,为什么我会收到这样的错误?
tunfd 与非阻塞模式或 libevent 不兼容?
谢谢!
我发现 Python 会自动关闭我的文件描述符。运行以下代码并使用lsof查找打开的文件。当 sleep in function 时openAndSleep,我发现文件“fff”被进程保存。但是当它用完该功能时,文件“fff”不再保留。
import time
def openAndSleep():
f = open("fff", 'w')
print "opened, sleep 10 sec"
time.sleep(10)
print "sleep finish"
openAndSleep()
print "in main...."
time.sleep(10000)
Run Code Online (Sandbox Code Playgroud)
我检查类文件,它没有__del__方法。看起来很奇怪,有人知道吗?
我在Linux,A和B上有两个进程.我想从进程A与进程B共享文件描述符,现在我只是将它序列化为a char*并将其传递给execl参数,但这不起作用.
Ac看起来像这样:
union descriptor{
char c[sizeof(int)];
int i;
} fd;
pid_t pid;
fd.i = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// Perform other socket functions
pid = fork();
if(pid == 0){
// Read data from socket
if(execl("./B", fd.c, NULL) < 0){
exit(EXIT_FAILURE);
}else(
exit(EXIT_SUCCESS);
}
}else if(pid < 0){
exit(EXIT_FAILURE);
}else{
waitpid(pid, NULL, 0);
}
Run Code Online (Sandbox Code Playgroud)
Bc看起来像这样:
union descriptor{
char c[sizeof(int)];
int i;
} fd;
memcpy(&fd.c[0], argv[0], sizeof(int));
write(fd.i, "TEST", 4);
close(fd.i);
Run Code Online (Sandbox Code Playgroud)
但这不起作用,我不明白为什么不.我怎样才能做到这一点?如果它的工作原理,它是经过共享父母和孩子之间的文件描述符的最佳解决方案fork和一个exec?
问题与我提出的问题无关,它是由@OliCharlesworth指出的传递整数的错误方式引起的.请关闭这个问题.
我们正在尝试限制整个容器的打开文件总数.使用ulimit限制主机中的开放fds.从我们所知的docker容器作为主机操作系统上的进程运行,因此我们应该能够使用ulimit限制每个docker容器的打开文件总数.
但是我们能够跨越容器中打开文件的总数[主机上的ulimit值].
docker是否有明确定义的机制来限制每个容器打开文件的数量?
在尝试学习套接字编程时,我看到了以下代码:
int sock;
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
Run Code Online (Sandbox Code Playgroud)
我浏览了手册页,发现套接字返回了一个文件描述符。我曾尝试在这里搜索互联网和其他类似问题,但我无法理解文件描述符到底是什么。我必须在两天内完成我的套接字编程课程。所以如果有人能用简单的语言解释文件描述符,那就太好了。
我想模拟 Bash 函数的返回值,我想知道是否可以使用临时文件描述符来传递该值。
换句话说:
function myfunction {
# print `stdout_value` to stdout
# print `stderr_value` to stderr
# print `return_value` to FD3 (or other)
}
# the values printed to stderr/stdout should be printed, but only
# `return_value` should be assigned to `myvalue`
myvalue=$(myfunction <FDs manipulation>)
Run Code Online (Sandbox Code Playgroud) 我想将 的输出通过管道eval传输到文件。如果命令执行成功,这将按预期工作:
eval ls > log.txt 2>&1
cat log.txt # Documents Desktop
Run Code Online (Sandbox Code Playgroud)
如果命令不成功,它也有效
eval rm Desktop > log.txt 2>&1
cat log.txt # rm: cannot remove 'Desktop': Is a directory
Run Code Online (Sandbox Code Playgroud)
但是,如果命令不存在,我无法重定向 stderr
eval abcde > log.txt 2>&1 # fish: Unknown command abcde
cat log.txt # (empty)
Run Code Online (Sandbox Code Playgroud)
如何将第三种情况的输出也重定向到日志文件?
一些与工作source也将非常赞赏:
echo abcde | source > log.txt 2>&1
Run Code Online (Sandbox Code Playgroud)