问题标签 [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.

0 投票
2 回答
740 浏览

bash - shell 脚本在一台服务器上运行良好,但在另一台服务器上运行良好

以下脚本在一台服务器上运行良好,但在另一台服务器上出现错误

我只是想读取一个包含各种脚本路径的文件,然后检查这些脚本是否已经在运行,如果没有运行它们。该文件/var/www/iphorex/live/infi_script.txt肯定存在。我在我的亚马逊服务器上收到以下错误-

提前感谢您的帮助。

0 投票
3 回答
6736 浏览

multithreading - 从两个线程同时读取文件描述符

  1. 我的问题:在 Linux(和 FreeBsd 中,通常在 UNIX 中)是否可以/合法地从两个线程同时读取单个文件描述符?

  2. 我做了一些搜索,但一无所获,尽管很多人同时询问有关从/向套接字 fd 读取/写入的问题(意思是在其他线程正在写入时读取,而不是在其他线程正在读取时读取)。我也阅读了一些手册页,但对我的问题没有明确的答案。

  3. 为什么我问它。我试图实现一个简单的程序来计算标准输入中的行数,比如 wc -l。我实际上是在测试我自制的 C++ io 引擎的开销,发现 wc 快了 1.7 倍。我削减了一些 C++ 并接近 wc 速度但没有达到它。然后我尝试了输入缓冲区的大小,对其进行了优化,但 wc 显然还是快了一点。最后我创建了 2 个并行读取相同 STDIN_FILENO 的线程,这终于比 wc 快了!但是行数变得不正确......所以我想一些垃圾来自意外的读取。内核不关心读取什么进程吗?

编辑:我做了一些研究,发现直接通过系统调用调用 read 并没有改变任何东西。内核代码似乎做了一些同步处理,但我不太了解(read_write.c)

0 投票
1 回答
217 浏览

perl - 4-参数-选择-问题

从 SELECT_TUT:

"... 用于有效地监控多个文件描述符,查看它们中的任何一个是否“就绪”或变为“就绪”;也就是说,查看 I/O 是否成为可能,或者任何一个“异常情况”发生的描述符......

那么 select() 的意义何在?我不能随时读写我的描述符吗?select() 的要点是它同时监视多个描述符,并在没有活动的情况下正确地使进程进入睡眠状态。Unix 程序员经常发现自己处于必须处理来自多个文件描述符的 I/O 的位置​​,其中数据流可能是断断续续的。如果您仅创建一系列 read(2) 和 write(2) 调用,您会发现其中一个调用可能会阻塞等待来自/到文件描述符的数据,而另一个文件描述符未使用但已为我准备好/O。select() 有效地应对了这种情况。”

有人可以解释一下,这意味着什么以及它是如何工作的,也许有一个小例子。

例如这里只选择了一个文件句柄,为什么我需要监控?

0 投票
1 回答
330 浏览

macos - 与 AuthorizationExecuteWithPrivileges 的双向通信

我需要使用AuthorizationExecuteWithPrivileges执行一个辅助工具,将一些数据发送到它的标准输入,并阅读标准输出的回复。我可以成功执行辅助工具并通过通信管道读取其标准输出,但如果我写入其标准输入,我必须关闭文件描述符以发送 EOF,否则辅助工具会无限期地等待。由于返回的只是一个为读写而打开的文件描述符,我如何只关闭写端,但保持读端打开?

0 投票
2 回答
4998 浏览

c - Unix Shell 在 C 中实现 Cat - 文件描述符问题

我已经完成了 Unix shell 的实践实现,除了当它的输出是文件时我在实现时遇到问题;catIE: 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",正如我在控制台上显示的那样。然后执行execvpwhich handles cat foo.txt,但将其打印到控制台而不是文件。

我意识到此时不应该这样做,因为它output_fd = -1是不可取的,应该返回另一个值;但我不知道如何正确使用文件描述符来打开一个新的/现有的文件cat foo.txt > bar.txt并写入它,以及返回到命令行的标准输入。

我已经设法输出到文件,但后来失去了正确的标准输入。有人可以在这里指导我吗?我觉得我在做一些愚蠢的事情,因为我做错了或正在看。

非常感谢任何帮助。

0 投票
2 回答
229 浏览

system - 如何在 C 中停止溢出文件描述符

我正在向 88kb 的文件描述符写入一条消息。我的 linux 系统上的文件描述符只能容纳 64kb。一旦数据被放在文件描述符上,它就会被读取并通过管道传输到 tcp 连接中。

我怎么知道我是否可以向文件描述符写入更多数据,这意味着文件描述符是空的?我需要一个函数来阻止文件描述符为空,或者至少可以返回一个值,让我知道如何安全地将数据写入文件描述符。

0 投票
13 回答
291578 浏览

unix - 什么是文件描述符,用简单的术语解释?

  1. 与维基百科相比,文件描述符的更简化描述是什么?为什么需要它们?比如说,以shell进程为例,它是如何应用的呢?

  2. 进程表是否包含多个文件描述符。如果是,为什么?

0 投票
2 回答
1590 浏览

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 的描述符。

我不确定从那里去哪里。显然有些东西使应用程序达到了极限,但我对接下来要检查的内容完全一无所知。有什么想法吗?

0 投票
1 回答
1539 浏览

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的构建:

0 投票
1 回答
24501 浏览

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() 之后):

我没有收到“无法重定向命令输出”。错误。正如我所提到的,这是一项家庭作业,所以我不是在寻找任何人来解决这个问题,而是为我指明正确的方向。