jjzjj

c - 读取(fd,NULL,0);它有什么作用?它定义明确吗?

我在一些程序中看到了以下声明,大多数/所有似乎都是为Linux制作的。rv=read(fd,NULL,0);在一些程序中它在一个循环中,在一些单独的语句中。它到底有什么作用?手册页说像这样的调用可能会或可能不会检查错误...返回值有什么意义?支持哪些类型的文件描述符?如果rv==0如何区分“无错误”和例如“套接字关闭”。 最佳答案 此调用将对文件描述符进行所有常见的错误检查,但不会从中检索任何数据。如果您希望确定文件描述符是否仍然有效而不阻塞它,这将很有用。如果发生错误,它将返回-1,否则返回0。man2read中列出的大部分错误都

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 - 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

c - 增加 FD_SETSIZE 的限制并选择

我想为我的系统增加FD_SETSIZE宏值。有什么办法可以增加FD_SETSIZE这样select就不会失败 最佳答案 根据标准,无法增加FD_SETSIZE。一些程序和库(想到libevent)试图通过为fd_set对象分配额外空间并将大于FD_SETSIZE的值传递给FD_*来解决这个问题宏,但这是一个非常糟糕的主意,因为健壮的实现可能会对参数执行边界检查并在超出范围时中止。我有一个应该始终有效的替代解决方案(即使它不是标准所要求的)。代替单个fd_set对象,分配一个足够大的数组来容纳您需要的最大fd,然后使用FD_SET(f

具有代理设置的 Android 模拟器 - 错误 FATAL :.//android/base/sockets/Check failed : isValidFd(fd). fd 1404 max1024

需要使用代理设置运行模拟器,我在命令提示符下使用以下命令来启动模拟器emulator-avdAVD_for_3_7_WVGA_Nexus_One-http-proxyhttp://username:password@IP:Port没有http-proxy开关它工作正常,而使用http-proxy时发生以下错误:FATAL:.//android/base/sockets/SocketWaiter.cpp:89:Checkfailed:isValidFd(fd).fd1404max1024 最佳答案 我遇到了完全相同的问题。幸运的是,有