如网络编程书籍中所述,select()监视一组文件描述符以供读取.例如,以下是代码的一部分:
select(numfds, &read_fds, NULL, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)
这numfds是read_fds + 1中套接字的最大数量.是否意味着,每个"监视器"循环都会监视select()进程的所有文件描述符,从0到numfds?我的意思是,如果我只有两个文件描述符来监视(0和26),是否选择观察从0到26的所有描述符?
是否有任何可移植的方式(在POSIX系统上)来确定文件描述符是否可搜索?我的想法是使用lseek(fd, 0, SEEK_CUR);并检查返回值是否为-1,但我不确定这是否会给出假阴性或误报.使用fstat和假设哪些类型的文件是可搜索/不可搜索的并不是一个好主意.还有其他想法吗?
在我的脚本中,我希望能够根据特定条件写入文件或stdout.我很好奇为什么这在我的脚本中不起作用:
out=\&1
echo "bird" 1>$out
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的引号组合,但我继续创建一个"&1"文件,而不是写入stdout.我该怎么做才能让我的工作方式如何?
如果我重新加载我的应用程序(从带有重新加载按钮的浏览器)很多时候50 reload/10 seconds它会给我这个错误:
events.js:45
throw arguments[1]; // Unhandled 'error' event
^
Error: EBADF, Bad file descriptor
Run Code Online (Sandbox Code Playgroud)
这在我看来像带宽错误或类似的东西,最初我在使用HTML 5 Audio API时遇到错误,如果我按顺序加载音频文件10-15次,那么我就得到了错误,但是现在我发现我在没有音频API的情况下得到错误只是通过重新加载网站很多次,Safari也比Chrome更快地给我错误(WTF?)
我正在使用带有express+的Node.js 0.4.8,jade并且我还使用该db-mysql模块连接到MySQL数据库.
我在网上找不到任何关于这个主题的文章有什么帮助,所以pleeease让我知道什么可能导致这个错误,因为它真的令人困惑:(
如果你在同一个文件描述符中调用read(或者write两个)两个不同的线程会发生什么(让我们说我们对本地文件感兴趣,并且它是一个套接字文件描述符),而不使用显式的同步机制?
读取和写入都是系统调用,因此,在单核CPU上,可能不幸的是两个读取将"同时"执行.但是有多个核心......
linux内核会做什么?
让我们更通用一点:其他内核(如BSD)的行为总是一样的吗?
编辑:根据密切的文档,我们应该确保文件描述符不被其他线程中的系统调用使用.因此,它的接缝显式同步将关闭文件描述符之前,需要进行(等,还围绕读/写,如果线程可以称之为仍在运行).
我理解文件描述符是用于标识文件的内核句柄,而文件的inode编号是指向具有关于文件的其他详细信息的结构的指针(如果我错了,请纠正我).但我无法区分它们.
POSIX指定了一个fdopen函数,它FILE为文件描述符创建一个.POSIX还指定了一个fileno函数,该函数返回a的文件描述符FILE.总之,这两个可以用于创建第二个FILE访问与现有文件相同的底层文件描述符:
FILE *secondfile(FILE *f, const char *mode)
{
int fd = fileno(f);
return fd >= 0 ? fdopen(fd, mode) : NULL;
}
Run Code Online (Sandbox Code Playgroud)
这是POSIX下定义明确的操作吗?当我访问同一个文件描述符的原始FILE和第二个时,会发生什么FILE?是否指定了交互?如果有,怎么样?
从历史上看,Unices FILE为您打开的20个文件使用了固定的结构表.调用fdopen()已经与a关联的文件描述符FILE会因此破坏现有文件并产生未定义的行为.我不确定stdioPOSIX是否仍然允许这样的实现,这就是我提出这个问题的原因.
在C伪代码中:
while (1) {
fifo = open("fifo", O_RDONLY | O_NONBLOCK);
fd_set read;
FD_SET(fifo, &read);
select(nfds, &read, NULL, NULL, NULL);
}
Run Code Online (Sandbox Code Playgroud)
进程在触发时休眠,select()直到另一个进程写入fifo.之后它总是会找到fifo一个可读的文件描述符.
如何避免这种行为(也就是说,在fifo读过一次之后,如何让它在被另一次写入之前被发现是不可读的?)
我有兴趣知道我可以期待的文件描述符的有效值.
请让我解释一下.我知道,例如,当我#include <unistd.h>在我的linux系统上使用然后调用打开文件进行阅读时:
int fileDescriptor;
fileDescriptor = open("/some/filename",O_RDONLY);
Run Code Online (Sandbox Code Playgroud)
可能会发生错误,因此我收到-1.
毫无疑问,( - 1)否定的必须具有某种特殊含义.是否所有其他值都是有效的文件描述符?即也是-2和-1023等负面的?
假设int是4个字节(sizeof(int)==4),那么就是
(-1) = 10000000 0000000 00000000 00000001
Run Code Online (Sandbox Code Playgroud)
将是唯一可检测的无效文件描述符?其他人会喜欢:
(0) = 00000000 0000000 00000000 00000000 (-2) = 10000000 0000000 00000000 00000010(2) = 00000000 0000000 00000000 00000010 好吗?由于文件描述符可以存储4个字节,因此我可以拥有最多(2 ^(8*4)-1)个有效文件描述符,因此这将是我可以打开的最大文件数,对吗?
再说一遍:
我应该期望(有效)文件描述符是什么?
任何值,但-1?
file-descriptor ×10
c ×7
linux ×2
posix ×2
bash ×1
fifo ×1
filesystems ×1
inode ×1
large-files ×1
node.js ×1
posix-api ×1
redirect ×1
select ×1
sockets ×1
stdio ×1
validation ×1