在我尽力研究实现消息队列服务器的最佳方法后,我问了这个问题.为什么操作系统会限制进程和全局系统可以拥有的打开文件描述符的数量?我当前的服务器实现使用zeromq,并为每个连接的websocket客户端打开一个订阅者套接字.显然,单个进程只能将客户端处理到fds的极限.当我研究这个主题时,我发现了很多关于如何将系统限制提高到高达64k fds的信息,但它从未提到它如何影响系统性能以及为什么它开始时为1k或更低?我目前的方法是尝试使用自己的循环中的协程向所有客户端发送消息,以及所有客户端及其订阅通道的映射.但我只是想听听关于文件描述符限制以及它们如何影响试图在每个客户端级别使用持久连接的应用程序的可靠答案?
operating-system file-descriptor message-queue zeromq websocket
我想知道是否有一种简单的方法来迭代fd_set?我想这样做的原因是不必遍历所有连接的套接字,因为select()改变这些fd_sets只包括我感兴趣的那些.我也知道使用一种不打算直接访问的类型的实现通常是一个坏主意,因为它可能在不同的系统中有所不同.但是,我需要一些方法来做到这一点,而且我的想法已经不多了.所以,我的问题是:
如何遍历fd_set?如果这是一个非常糟糕的做法,除了循环所有连接的套接字之外,还有其他方法可以解决我的"问题"吗?
谢谢
我想为我的系统增加FD_SETSIZE宏值.有没有办法增加FD_SETSIZE所以选择不会失败
我正在学习Unix中的网络编程,目前正在尝试理解套接字和文件描述符的概念.根据我的理解,文件描述符只是指针数组中的位置(文件描述符表?),这些指针指向内存中的某个文件.
套接字描述符与文件描述符共享此数组,但指针指的是套接字.或者还有什么东西只用于套接字?
这个数组对每个应用程序/进程都是唯一的吗
这实际上是一个两步问题:
究竟什么是文件描述符?我认为这是表示打开文件的最基本方式.但是由于dup2可以使两个不同的文件描述符指向同一个文件,那么它代表一个唯一文件是什么?
如果我在exec之前执行dup2,那么整个程序就会被删除,它是否还有相同的文件描述符表?重定向的文件描述符是否仍然被重定向?
我试图在我的例行程序中附加到日志记录文件时收到错误的文件描述符.
write ./log.log: bad file descriptor
该文件存在且具有666权限.起初我认为可能是因为他们每个人都试图同时打开文件.我实现了一个互斥锁,试图避免这种情况,但是遇到了同样的问题,所以我删除了它.
logCh := make(chan string, 150)
go func() {
for {
msg, ok := <-logCh
if ok {
if f, err := os.OpenFile("./log.log", os.O_APPEND, os.ModeAppend); err != nil {
panic(err)
} else {
logTime := time.Now().Format(time.RFC3339)
if _, err := f.WriteString(logTime + " - " + msg); err != nil {
fmt.Print(err)
}
f.Close()
}
} else {
fmt.Print("Channel closed! \n")
break
}
}
}()
Run Code Online (Sandbox Code Playgroud) 当一个人调用select()询问哪些文件描述符有"异常"等待时,这是什么意思?
如何触发其中一个"例外"?
如果有人能给我一个很好的解释,那就太棒了.我一直在谷歌搜索,无法找到一件事.
如何从现有文件描述符创建新文件描述符,以使新描述符不共享文件表中相同的内部文件结构/条目?特别是新文件描述符和旧文件描述符之间不应共享诸如文件偏移(以及优选地权限,共享和模式)之类的属性.
在Windows和Linux下,dup()将复制文件描述符,但两个描述符仍然指向进程文件表中的相同文件结构.对任一描述符的任何搜索也将调整其他描述符的位置.
注意
我已经收到了Windows和Linux的答案,并且经常调整问题,这使得人们很难回答.我将调整我的投票并接受涵盖Windows 和 Linux 的最简洁的答案.向所有人道歉,我仍然是SO范式的新手.谢谢你的答案!
可能重复:
从std :: fstream获取文件*
我正在研究Linux,文件描述符是这个操作系统的主要模型.
我想知道是否有任何库或任何方法从C++开始检索本机Linux文件描述符std::fstream.
我想过,boost::iostream因为有一个叫做的课,file_descriptor但我明白它的目的与我想要达到的目的不同.
你知道某种方法吗?
我试图通过linux socket发送一些文件描述符,但它不起作用.我究竟做错了什么?一个人应该如何调试这样的东西?我尝试在可能的地方放置perror(),但他们声称一切正常.这是我写的:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <fcntl.h>
void wyslij(int socket, int fd) // send fd by socket
{
struct msghdr msg = {0};
char buf[CMSG_SPACE(sizeof fd)];
msg.msg_control = buf;
msg.msg_controllen = sizeof buf;
struct cmsghdr * cmsg = CMSG_FIRSTHDR(&msg);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
cmsg->cmsg_len = CMSG_LEN(sizeof fd);
*((int *) CMSG_DATA(cmsg)) = fd;
msg.msg_controllen = cmsg->cmsg_len; // why does example from man need it? isn't it redundant?
sendmsg(socket, …Run Code Online (Sandbox Code Playgroud)