问题标签 [file-descriptor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
bash - shell 脚本在一台服务器上运行良好,但在另一台服务器上运行良好
以下脚本在一台服务器上运行良好,但在另一台服务器上出现错误
我只是想读取一个包含各种脚本路径的文件,然后检查这些脚本是否已经在运行,如果没有运行它们。该文件/var/www/iphorex/live/infi_script.txt
肯定存在。我在我的亚马逊服务器上收到以下错误-
提前感谢您的帮助。
multithreading - 从两个线程同时读取文件描述符
我的问题:在 Linux(和 FreeBsd 中,通常在 UNIX 中)是否可以/合法地从两个线程同时读取单个文件描述符?
我做了一些搜索,但一无所获,尽管很多人同时询问有关从/向套接字 fd 读取/写入的问题(意思是在其他线程正在写入时读取,而不是在其他线程正在读取时读取)。我也阅读了一些手册页,但对我的问题没有明确的答案。
为什么我问它。我试图实现一个简单的程序来计算标准输入中的行数,比如 wc -l。我实际上是在测试我自制的 C++ io 引擎的开销,发现 wc 快了 1.7 倍。我削减了一些 C++ 并接近 wc 速度但没有达到它。然后我尝试了输入缓冲区的大小,对其进行了优化,但 wc 显然还是快了一点。最后我创建了 2 个并行读取相同 STDIN_FILENO 的线程,这终于比 wc 快了!但是行数变得不正确......所以我想一些垃圾来自意外的读取。内核不关心读取什么进程吗?
编辑:我做了一些研究,发现直接通过系统调用调用 read 并没有改变任何东西。内核代码似乎做了一些同步处理,但我不太了解(read_write.c)
perl - 4-参数-选择-问题
从 SELECT_TUT:
"... 用于有效地监控多个文件描述符,查看它们中的任何一个是否“就绪”或变为“就绪”;也就是说,查看 I/O 是否成为可能,或者任何一个“异常情况”发生的描述符......
那么 select() 的意义何在?我不能随时读写我的描述符吗?select() 的要点是它同时监视多个描述符,并在没有活动的情况下正确地使进程进入睡眠状态。Unix 程序员经常发现自己处于必须处理来自多个文件描述符的 I/O 的位置,其中数据流可能是断断续续的。如果您仅创建一系列 read(2) 和 write(2) 调用,您会发现其中一个调用可能会阻塞等待来自/到文件描述符的数据,而另一个文件描述符未使用但已为我准备好/O。select() 有效地应对了这种情况。”
有人可以解释一下,这意味着什么以及它是如何工作的,也许有一个小例子。
例如这里只选择了一个文件句柄,为什么我需要监控?
macos - 与 AuthorizationExecuteWithPrivileges 的双向通信
我需要使用AuthorizationExecuteWithPrivileges执行一个辅助工具,将一些数据发送到它的标准输入,并阅读标准输出的回复。我可以成功执行辅助工具并通过通信管道读取其标准输出,但如果我写入其标准输入,我必须关闭文件描述符以发送 EOF,否则辅助工具会无限期地等待。由于返回的只是一个为读写而打开的文件描述符,我如何只关闭写端,但保持读端打开?
c - Unix Shell 在 C 中实现 Cat - 文件描述符问题
我已经完成了 Unix shell 的实践实现,除了当它的输出是文件时我在实现时遇到问题;cat
IE: cat foo.txt > bar.txt
-foo
将 的内容输出到bar
.
让我们从主函数开始,然后我将定义子方法:
handle_user_input
只需填充cmd_argv
数组以执行,如果用户希望输出到文件,则user_input
删除>
并设置标志。output
这是该方法的核心:
execute_command
然后调用,解释现在填充的cmd_argv
. 只是为了让您了解全局。显然,这些情况都不匹配,并且create_process
调用了该方法:
很直截了当,对吧?
create_process
是我遇到问题的地方。
我的印刷品output_fd = -1
,我设法得到perror("open")
里面的其他说明:open: No such file or directory
。然后它打印出它是"writing to COMMAND PROMPT instead of FILE"
,正如我在控制台上显示的那样。然后执行execvp
which handles cat foo.txt
,但将其打印到控制台而不是文件。
我意识到此时不应该这样做,因为它output_fd = -1
是不可取的,应该返回另一个值;但我不知道如何正确使用文件描述符来打开一个新的/现有的文件cat foo.txt > bar.txt
并写入它,以及返回到命令行的标准输入。
我已经设法输出到文件,但后来失去了正确的标准输入。有人可以在这里指导我吗?我觉得我在做一些愚蠢的事情,因为我做错了或正在看。
非常感谢任何帮助。
system - 如何在 C 中停止溢出文件描述符
我正在向 88kb 的文件描述符写入一条消息。我的 linux 系统上的文件描述符只能容纳 64kb。一旦数据被放在文件描述符上,它就会被读取并通过管道传输到 tcp 连接中。
我怎么知道我是否可以向文件描述符写入更多数据,这意味着文件描述符是空的?我需要一个函数来阻止文件描述符为空,或者至少可以返回一个值,让我知道如何安全地将数据写入文件描述符。
unix - 什么是文件描述符,用简单的术语解释?
与维基百科相比,文件描述符的更简化描述是什么?为什么需要它们?比如说,以shell进程为例,它是如何应用的呢?
进程表是否包含多个文件描述符。如果是,为什么?
c++ - 尽管多线程 Web 应用程序有很高的限制,但 mmaped 文件的文件描述符不足
我有一个映射大量文件的应用程序。3000+左右。它还使用大约 75 个工作线程。该应用程序是用 Java 和 C++ 混合编写的,Java 服务器代码通过 JNI 调用 C++。
它经常(尽管不可预测)用完文件描述符。我已将 /etc/security/limits.conf 中的限制提高到:
/proc/sys/fs/file-max 是 101752。系统是一个 Linode VPS,运行 Ubuntu 8.04 LTS,内核为 2.6.35.4。
在某个点之后,代码的 Java 和 C++ 位都打开失败。Netstat 没有显示大量打开的套接字(“netstat -n | wc -l”低于 500)。lsof 或 /proc/{pid}/fd 中打开的文件数约为预期的 2000-5000。
这让我已经抓住了几个星期的稻草(不是经常,但每次我开始收到有关事情进展顺利的通知时都会闪现恐惧和厌恶)。
还有其他一些松散的线程让我想知道它们是否提供任何见解:
由于该进程有大约 75 个线程,如果 mmaped 文件以某种方式占用每个线程的一个文件描述符,那么这些数字就会相加。也就是说,对 /proc/{pid}/tasks/*/fd 中的内容进行递归计数当前列出了 215575 个 fd,因此它似乎应该已经达到了极限,而实际上并没有达到极限,所以这似乎不太可能。
Apache + Passenger 也在同一个机器上运行,并以最多的文件描述符排在第二位,但即使有子进程,这些进程也没有超过 10k 的描述符。
我不确定从那里去哪里。显然有些东西使应用程序达到了极限,但我对接下来要检查的内容完全一无所知。有什么想法吗?
c - C:执行前的 dup2()
对于家庭作业,我必须编写一个基本的 shell,包括重定向。该程序使用 readline 提示输入,解析输入字符串,并将其分解为可执行文件名称、参数和输入/输出文件(如果适用)。解析字符串后,它分叉并将子 execv() 分配给传入的可执行文件。我使用 dup2() 在分叉之后和 execv 之前更改文件描述符,但是一旦出现问题程序已执行到新的可执行文件。如果在我的 shell 中运行ls > foo.out
,我会得到:ls: cannot access H��y�A�
$ L��H)�I��$�: No such file or directory
c->argv的构建:
c - C: `write error: Bad file descriptor` 在 fork、dup2 和 execv 之后
继续这个问题,但我会重申:
对于家庭作业,我必须编写一个基本的 shell,包括重定向。该程序使用 readline 提示输入,解析输入字符串,并将其分解为可执行文件名称、参数和输入/输出文件(如果适用)。解析字符串后,它分叉并将子 execv() 分配给传入的可执行文件。我使用 dup2() 在分叉之后和 execv 之前更改文件描述符,但是一旦出现问题程序已执行到新的可执行文件。如果在我的 shell 中运行ls > foo.out
,我会得到:ls: write error: Bad file descriptor
这是我的子进程的代码(这是在 fork() 之后):
我没有收到“无法重定向命令输出”。错误。正如我所提到的,这是一项家庭作业,所以我不是在寻找任何人来解决这个问题,而是为我指明正确的方向。