草庐IT

m_accept_fd

全部标签

c++ - 避免在多线程套接字应用程序中重复使用相同的 fd 号

我有一个异步应用程序执行多个线程,这些线程在套接字上执行操作,在套接字上安排操作然后异步执行。我试图避免这样一种情况,即一旦通过套接字安排了读取操作,套接字就会关闭并重新打开(可能由另一个操作中的另一个对等方),在第一个操作开始执行之前,这将最终读取正确的文件描述符,但错误的对等体。问题来了,因为(accept();close();accept())在两个accept()中返回了相同的fd,会导致上述情况。我找不到避免它的方法。有什么提示吗? 最佳答案 好的,找到答案了。这里最好的方法是调用accept()并获得可用的最低fd,用你

c - Linux 3.5 : Safe to `read(2)` from same fd `open(2)` `/dev/urandom` from multiple threads?

这样做安全吗:intfd;voidthread_main(){charbuf[M];ssize_tr=read(fd,buf,M);assert(r==M);...}intmain(){fd=open("/dev/urandom",O_RDONLY);for(inti=0;i即:从主线程open(2)ing"/dev/urandom"后,read(2)是否安全code>来自它与不同线程上下文不同步?断言在什么情况下会触发?两个线程会得到相同的数据吗?会出什么问题? 最佳答案 只要您的代码不会崩溃,它就是安全的。assert永远不会触

c - epoll 是否保留 fd 的注册顺序?

我正在研究Linux系统调用,我发现了epoll的某些方面,这对我来说不是很清楚。比如说,我创建了一个epoll实例:epollfd=epoll_create(50);接下来,我在for循环中注册了50个文件描述符:for(i=0;i现在我们有50个文件,可以进行操作(读或写——无关紧要)。我们将MAX_EVENTS设置为3:#defineMAX_EVENTS3...structepoll_eventevents[MAX_EVENTS]...epoll_wait(epollfd,events,MAX_EVENTS,-1)所有这50个文件都已准备就绪,我们只要求其中的3个。哪些文件将在e

stdout 的 Linux proc/pid/fd 是 11?

使用重定向到文件的标准输出执行脚本。所以/proc/$$/fd/1应该指向那个文件(因为stdoutfileno是1)。但是,该文件的实际fd是11。请解释原因。这是session:$cathello.sh#!/bin/sh-els-l/proc/$$/fd>&2$./hello.sh>/tmp/1total0lrwx------1ngausers64May2822:050->/dev/pts/0lrwx------1ngausers64May2822:051->/dev/pts/0lr-x------1ngausers64May2822:0510->/home/me/hello.sh

linux - 我可以同时从多个线程为一个套接字调用 accept() 吗?

我使用的是Linux3.2.0,x86_64。我可以同时从多个线程为一个套接字调用accept()吗? 最佳答案 是的,您可以从多个线程和多个进程在同一个监听套接字上调用accept(),尽管它可能没有您想象的那么重要。内核只会让一个成功。当这对进程完成时,它被称为预fork,它为每个新连接节省了fork()的费用。但是当你处理线程时,你可以更容易地拥有一个等待新连接队列的现有线程池。一个线程执行accept并写入队列,工作线程读取队列并执行它们的操作。它更简洁,是一种易于理解的模式,而且您几乎不会丢失任何东西。

c - 从 SSH 服务器发送 channel 请求,使 `ssh_channel_accept_forward()` 在 SSH 客户端上返回?

我使用官方教程中直接和反向端口转发的客户端代码:http://api.libssh.org/master/libssh_tutor_forwarding.html当客户端连接到Ubuntu16.10上的OpenSSH服务器时,此代码完美运行,即实现了直接和反向端口转发。但是,请考虑用于反向端口转发的客户端代码(web_server()),它使用以下调用:ssh_channel_listen_forward()ssh_channel_accept_forward()使用我自己的libssh服务器,问题是客户端在调用ssh_channel_accept_forward()时超时,错误消息如

linux - socket编程中如何使用select和FD_SET?

我是套接字编程的新手,我无法理解select()和FD_SET()的工作原理。我修改了Beej教程中的一个示例,试图弄明白。我想在for循环中做的是在每次迭代时等待4秒。如果读取可用,我会打印“Akeywaspressed”,如果超时,则打印“Timedout”。然后我会清除集合并重复这个过程9次。但似乎一旦设置了文件描述符0,即使在调用FD_ZERO()和/或FD_CLR()之后,它也永远不会取消设置。换句话说,在我在循环的第一次迭代中按下一个键后,文件描述符被设置用于其余的迭代并且不再等待。所以一定有什么我想念的,但我不知道是什么。#include#include#include#

linux - lsof 列出的管道的 FD 列是什么意思?

我正在使用以下命令获取管道列表:lsof|grepPIPE我想知道FD列的值是什么意思(第5个http://i.imgur.com/KHczptf.png)。我认为r和w分别表示read和write,但是每个后面的数字是什么意思这些字符是什么意思?我知道FD表示文件描述符,我想弄清楚列中显示的值的含义,如3r、16w、20r等。 最佳答案 文件不仅以流的形式打开。其中一些在lsof的手册中列出:FDistheFileDescriptornumberofthefileor:cwdcurrentworkingdirectory;Lnnl

c - 通过fd获取目录路径

我遇到了在Linux中根据文件描述符通过路径引用目录的需求。路径不必是规范的,它只需要是功能性的,这样我就可以将它传递给其他函数。因此,采用与传递给fstatat()这样的函数相同的参数,我需要能够调用像getxattr()这样没有的函数code>f-XYZ-at()变体。到目前为止,我已经提出了这些解决方案;尽管没有一个特别优雅。最简单的解决方案是通过调用openat()然后使用类似fgetxattr()的函数来避免该问题。这有效,但并非在所有情况下都有效。因此需要另一种方法来填补空白。下一个解决方案是查找proc中的信息:if(!access("/proc/self/fd",X_O

linux - 在没有服务器调用 'connect' 的情况下,套接字上的 'accept' 调用能否成功返回?

服务器已经创建了一个套接字并绑定(bind)到一个端口,并启动了一个循环中的线程来接受连接。稍后由于导致线程退出的异常而退出循环,但套接字仍绑定(bind)到端口。现在,如果客户端“连接”到该服务器,则它成功了。这怎么可能?如果我理解正确,“连接”仅在服务器在监听套接字上“接受”后返回。我在这里遗漏了什么吗? 最佳答案 IfIunderstandcorrectly,'connect'returnsonlyafterserverdoes'accept'onthelisteningsocket.AmImissingsomethinghe