- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于我的硕士论文项目,我正在用 C 语言构建一个适用于 Unix 套接字的 API。简而言之,我有两个由它们的两个 fd 标识的套接字,我在其上调用了 O_NONBLOCK
connect()
.此时,我正在调用select()
检查哪个先连接并准备好写入。
问题从现在开始,因为使用此 API 的应用程序只知道其中一个套接字,比如说 fd1 标识的那个。如果 fd2 标识的套接字是第一个连接的,则应用程序无法知道它可以写入该套接字。
我认为我最好的选择是使用 dup()
和/或 dup2()
,但根据他们的手册页,dup()
创建传递给函数的 fd 的副本,但它引用相同的打开文件描述,这意味着两者可以互换使用,dup2()
关闭替换旧 fd 的新 fd。
所以我对会发生什么的假设是(在伪代码中)
int fd1, fd2, fd3;
fd1 = socket(x); // what the app is aware of
fd2 = socket(y); // first to connect
fd3 = dup(fd1); // fd1 and fd3 identify the same description
dup2(fd2, fd1); // The description identified by fd2 is now identified by fd1, the description previously identified by fd1 (and fd3) is closed
dup2(fd3, fd2); // The description identified by fd3 (copy of fd1, closed in the line above) is identified by fd2 (which can be closed and reassigned to fd3) since now the the description that was being identified by fd2 is being identified by fd1.
dup2()
关闭 fd1,它也关闭 fd3,因为它们标识相同的文件描述。第二个
dup2()
工作正常,但它正在替换已被第一个关闭的连接的 fd,而我希望它继续尝试连接。
connect()
的非常“花哨”版本的方法。
select()
和
close()
.
api_connect()
,它向函数传递一个指向 int 的指针(连同所有必要的地址和协议(protocol)等)。
api_connect()
将调用
socket()
,
bind()
和
connect()
, 重要的部分是它将写入
socket()
的返回值在通过指针解析的内存中。这就是我所说的“套接字只知道一个 fd”的意思。然后应用程序将调用
FD_SET(fd1, write_set)
,调用 api_select() 然后通过调用
FD_ISSET(fd1, write_set)
检查 fd 是否可写.
api_select()
或多或少像
select()
,但有一个计时器,如果连接花费的时间超过设定的连接时间(因为它是
O_NONBLOCK
),它可以触发超时。如果发生这种情况,
api_select()
在不同的接口(interface)上创建一个新连接(调用所有必要的
socket()
、
bind()
和
connect()
)。此连接由应用程序不知道的新 fd -fd2- 标识,并在 API 中进行跟踪。
api_select()
与
FD_SET(fd1, write_set)
并且 API 意识到这是已完成的第二个连接,从而使 fd2 可写,我希望应用程序使用 fd2。问题是应用程序只会调用
FD_ISSET(fd1, write_set)
和
write(fd1)
之后,这就是为什么我需要用 fd1 替换 fd2。
最佳答案
I think my best options are using
dup()
and/ordup2()
, but according to the their man page,dup()
creates a copy of the fd passed to the function, but which refers to the same open file description,
meaning that the two can be used interchangeably,
and
dup2()
closes the new fd which replaces the old fd.
dup2()
在将源描述符复制到它之前关闭目标文件描述符(如果它是打开的)。也许这就是您的意思,但我无法以这种方式阅读您的描述。
So my assumptions on what would happen are (excuse my crappy pseudo code)
int fd1, fd2, fd3;
fd1 = socket(x); // what the app is aware of
fd2 = socket(y); // first to connect
fd3 = dup(fd1); // fd1 and fd3 indentify the same description
dup2(fd2, fd1); // The description identified by fd2 is now identified by fd1, the description previously identified by fd1 (and fd3) is closed
fd1
首先关闭,然后复制为
fd2
.
fd1
的基础打开文件描述最初提到的是
不是 关闭,因为该进程有另一个与之关联的打开文件描述符
fd3
.
dup2(fd3, fd2); // The description identified by fd3 (copy of fd1, closed in the line above) is identified by fd2 (which can be closed and reassigned to fd3) since now the thescription that was being identified by fd2 is being identified by fd1.
Which looks fine, except for the fact that the first
dup2()
closes fd1,
which closes also fd3
since they are identifying the same file description.
dup()
序列,
dup2()
, 和
dup2()
调用应该完全实现您想要的那种交换,前提是它们都成功了。但是,它们确实会留下一个额外的打开文件描述符,这在许多情况下会导致文件描述符泄漏。因此,不要忘记完成一个
close(fd3);
fd1
的值这对应用程序来说是特殊的,而不是包含它的变量 .文件描述符只是数字。包含它们的对象本身并没有什么特别之处,所以如果它是变量
fd1
应用程序需要使用的,不管它的具体值是多少,那么你需要做的就是执行一个普通的整数交换:
fd3 = fd1;
fd1 = fd2;
fd2 = fd3;
When the application calls
api_connect()
, it passes to the function a pointer to an int (together with all the necessary addresses and protocols etc). api_connect() will call socket(), bind() and connect(), the important part is that it will write the return value of socket() in the memory parsed through the pointer.
api_connect()
通过指针写入文件描述符值或将其作为或在函数的返回值中传递来返回文件描述符值是无关紧要的。关键仍然是重要的是值(value),而不是包含它的对象(如果有的话)。
This is what I mean by "The socket is only aware of one fd". The application will then call
FD_SET(fd1, write_set)
, call aapi_select()
and then check if the fd is writable by callingFD_ISSET(fd1, write_set)
.
[Under some conditions,]
api_select()
creates a new connection on a different interface (calling all the necessary socket(), bind() and connect()). This connection is identified by a new fd -fd2- the application doesn't know about, and which is tracked in the API.Now, if the application calls
api_select()
withFD_SET(fd1, write_set)
and the API realises that is the second connection that has completed, thus making fd2 writable, I want the application to use fd2. The problem is that the application will only callFD_ISSET(fd1,
and
write_set)write(fd1)
afterwards, that's why I need to replace fd2 with fd1.
fd_set
中的成员身份。 ,因为这样的成员资格是合乎逻辑的,而不是物理的。您必须管理
fd_set
如果调用者依赖它,则手动加入。
api_select()
旨在同时为多个(调用者指定的)文件描述符提供服务,如
select()
可以,但我想这样做所需的簿记将是巨大的。另一方面,如果实际上该函数一次只处理一个调用者提供的 FD,则模仿
select()
的接口(interface)。是……奇怪。
dup2()
将新的 FD 放到旧的 FD 上,然后关闭新的?
关于c - 如何交换两个打开的文件描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54116344/
来自descriptor文档: A descriptor can be called directly by its method name. For example, d.__get__(obj).
概要 本人python理论知识远达不到传授级别,写文章主要目的是自我总结,并不能照顾所有人,请见谅,文章结尾贴有相关链接可以作为补充 全文分为三个部分装饰器理论知识、装饰器应用、装饰器延申
我正在查看 python 的描述 rune 档 here ,让我思考的陈述是: 对于物体,机械在 object.__getattribute__()转换 b.x进入 type(b).__dict__[
if((fd = creat(file_name,O_RDWR|S_IRWXU|S_IRWXG|S_IRWXO)) < 0){ perror("Create failed!");
长话短说Python 2.7.5,当使用描述符作为装饰器时,有没有办法传入参数(给 __init__ 方法)?或者如何使用带参数的方法装饰器 ( as here ) 访问类实例的属性? -- 我认为这
我试着用谷歌搜索一些关于它的东西。为什么非数据描述符适用于旧式类? 文档说他们不应该: “Note that descriptors are only invoked for new style ob
我升级到使用嵌入式 maven 3 的 netbeans 7。我有一个项目,其中包含许多模块和包含其他模块的模块。我的其他不依赖于内部项目的子模块可以在相同的配置下正常工作。在这种情况下,spring
我正在关注http://scikit-image.org/docs/0.11.x/auto_examples/plot_daisy.html ,但是不太清楚 desc[0],desc[1] 和 des
我有一个要求,其中有一个全局 FILE指针/描述符。其中一个函数将从该指针/描述符中读取。与FILE指针/描述符相关联的内部指针前进。此函数返回后,我想从同一个 FILE 指针/描述符中读取数据,并与
我正在编写一些描述符来封装数据验证,并想为它们编写测试。 我想知道是否应该通过在我的测试中创建描述符实例然后显式调用 __get__ 或 __set__ 方法来测试它们。 或者我应该在我的测试文件中创
我有这个 python 描述符: # Date Descriptor class DateAttribute(): def __init__(self, value=None):
分割: @font-face { font-family: 'RobotoLight'; src: url('../font/jura-demibold.eot'); src: url('../fon
我正在编写一个配置卷的存储自动化模块。我没有传递在存储 Controller 上实际创建卷所需的六个或更多参数,而是使用 __slots__ 创建了一个参数类,它被传递到 create 方法中,如下所
在我的应用程序中,我必须使用静态摄像头跟踪大学讲座中的讲师。目前我正在使用 Emgu CV 的默认 GPUHOGDescriptor,如果讲师的整个 body 都可见,它会很好用。在讲师站在 tabl
大家好,我正在使用 opencv3 和 contrib。问题是我想计算给定像素的筛选描述符(不使用检测到的关键点)。 我正在尝试用给定的像素构建一个关键点向量。但是,要创建关键点,除了像素位置外,我还
我正在使用 OpenCV 中的 HOGDescriptor 类进行对象检测。在我看来,该实现仅使用无符号渐变,因此无法区分亮->暗和暗->亮过渡,这是我真正需要的功能。有谁知道使用有符号梯度的 HOG
我目前正在使用 OpenCV 的 ORB 特征提取器,我确实注意到 ORB 描述符的存储方式很奇怪(至少对我来说是这样)(它基本上是一个 BRIEF-32,带有与我的问题无关的修改) .正如你们中的一
我想知道,在 MATLAB 中是否有针对“汽车”之类的对象而非人类的 HOG 描述符的任何实现? 但万一,只有人类,你能指导我找到那个代码,并给我一些提示,以改进代码以用于“汽车或摩托车等物体” 最佳
我正在尝试更好地理解描述符。 我不明白为什么在 foo 方法中描述符 __get__ 方法未被调用。 据我了解描述符 __get__ 当我通过点运算符访问对象属性或使用 __getattribute_
我想要一个类似于这个(无效)的结构: const uint8_t uArray[] = { uint8_t(sizeof(uArray)), 1, 2, 3 }; 并且 uArray[0] 应该是 4
我是一名优秀的程序员,十分优秀!