问题标签 [dup2]

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 投票
1 回答
87 浏览

terminal - 为孩子提供终端的完全访问权限,同时它还活着

我使用 fork() 来执行另一个程序,例如“vim”或“man bash”。但是,在那一刻我失去了控制,我无法在 vim 或 scroll 中打印任何东西。

所以,我的问题是:如何让孩子完全访问终端(输入/输出)并在孩子死后将其取回给父母?

0 投票
1 回答
622 浏览

c - 孩子中的 dup2 对父母持久

我对用 C 编写的服务器有一个奇怪的问题。

我有一个函数处理连接到我的服务器的每个客户端,因此该函数为服务器接收的每个连接调用一个 fork()。

问题是我里面有其他叉子,它们应该在我创建的文件中client-fork写入'输出进程(有调用的那个)死了。exec()dup2()exec()

所需的输出与此类似:

该代码不会产生所需的输出。它在 DUP2 之后卡住,其余的输出被重定向到文件。但是,如果我用TreatClient(client, nr);功能块替换该行,则代码可以正常工作。为什么会这样?另一个奇怪的问题是消息[server]Waiting at port 2021...也打印在文件中,而不是在屏幕上。

0 投票
1 回答
1858 浏览

c - fork/pipe/dup2 问题:子进程永远不会退出

我想编写一个小程序,打印出一个长列表,可以通过(或)在终端中分页,以便可以从头到脚检查列表...moreless

该程序:

  • fork' 关闭more执行程序的子进程
  • 在父进程中,打印列表
  • 在父/子之间有一个pipe设置,以便父打印到的列表stdout被发送到more程序的stdin

代码:

我大部分时间都在工作:

  • “Hello World!...”消息的长列表打印在终端上,由 a 剪裁,--More--因此我知道基本管道设置正在运行。
  • 如果我[q]在整个列表完成打印(退出more进程)之前按下,程序(父/子)按预期退出

我遇到的唯一问题是,如果我一直按[space][return](它会推进由 给出的输出more)并到达列表的末尾(第 500 个“Hello World!...”消息),那么终端就会挂起。按[q]是没有反应的(我必须 [ctrl+c]出去)。

父进程卡在wait. 即使我关闭了父级中的两个管道,该过程也没有退出more

0 投票
2 回答
3079 浏览

c - 关于 pipe() 和 dup2() 如何在 C 中工作的说明

我正在编写一个处理管道的简单外壳。我有工作代码,但我不太明白它是如何在幕后工作的。这是我需要帮助理解的修改后的代码片段(我删除了错误检查以缩短它):

我对我的问题有猜测,但仅此而已 - 猜测。以下是我的问题:

  1. 阻塞在哪里执行?在我见过的所有示例代码中,read()write()提供了阻塞,但我不需要在这里使用它们。我只是复制 STDIN 指向管道的读取端和 STDOUT 指向管道的写入端。我猜正在发生的是 STDIN 在执行后dup2(fd[0], 0)正在执行阻塞。这个对吗?
  2. 据我了解,每个正在运行的进程都有一个描述符表,指向文件表中打开的文件。当进程重定向 STDIN、STDOUT 或 STDERR 时会发生什么?这些文件描述符是否在所有进程的描述符表中共享?还是每个流程都有副本?重定向一个是否会导致更改在所有这些中反映出来?
  3. 在调用pipe()和随后的调用之后fork(),管道有 4 个“端”打开:父级访问的读取和写入端以及子级访问的读取和写入端。在我的代码中,我关闭了父母的写入端和孩子的读取端。但是,在完成管道后,我不会关闭剩余的两端。代码工作正常,所以我假设某种隐式关闭已经完成,但这都是猜测工作。我应该像这样添加显式调用来关闭剩余的两端吗?

    /li>
  4. 这更多是关于管道过程如何工作的概念性问题。有管道的读取端,由文件句柄引用,fd[0]管道的写入端,由文件句柄引用fd[1]。管道本身只是一个字节流表示的抽象。文件句柄代表打开的文件,对吗?那么这是否意味着在系统的某个地方,有一个文件(由 指向fd[1]),其中包含我们想要通过管道发送的所有信息?并且在通过字节流推送该信息之后,有一个文件(由 指向fd[0]),其中也写入了所有信息,从而创建了管道的抽象?

0 投票
0 回答
164 浏览

c - 多个 dup2、分叉、管道和 exec 的问题

我正在研究一个外壳(是的,这是一项任务,所以我不是在寻找解决方案,更多的是关于我做错了什么的指南和线索),而且我被管道卡住了。我已经阅读了许多教程,男人等等,甚至复制粘贴了一些“有效”的代码,似乎没有任何效果。

这是我到目前为止所拥有的:

我编写了各种 ft_something 函数来替代一些 libc 函数(ft_putstr 写入一个字符串,最后用 n 添加一个 \n 等)。ft_exec_special 是一个使用 execve 执行可执行文件的函数,在 PATH 变量中进行搜索。

当使用两个命令和一个管道运行时,它返回

虽然在我看来,通常情况下,它应该可以工作 - piped[0][0] 存在,被正确地通过管道传输,并且某些内容被写入 piped[0][1] - 为什么它会说 piped[0][0]是一个坏的文件描述符?

0 投票
1 回答
1207 浏览

c - dup2() 正在阻止输出

我的代码粘贴在下面。

我正在尝试使用 dup2 将我的输出重定向到文件。

如果我用它来重定向它工作正常(如果我删除评论),输出文件而不是标准输出。例如: ls > test ,导致 ls 输出到测试。

问题是没有 > 的 ls 不会输出任何东西。如果我按原样保留评论 ls 输出,尽管无法重定向。

redirect[0] 是 < 或 > 或什么都没有 redirect[1] 是要重定向到的文件的路径

command is 是一个 cstrings 数组,其中包含命令 commands 的图片

带有注释代码的示例输出

代码未注释

0 投票
1 回答
493 浏览

c - 在 C 中的 dup2 之后使用 execvp 运行 pico

我想要做的基本上是使用 dup2 在管道的写入端写入子进程的标准,并使用 execvp 运行 pico,父进程将读取文件的读取端并对其进行处理并将其写入标准输出并在 pico 中显示。这是在 Linux 机器下运行的。

我遇到的问题是,当我尝试执行write()标准输入时,pico 不会显示在终端中,并且我得到了这个奇怪的连续“S”(来自 r)输出,如下所示:

每当我尝试按任意键时,它都会添加更多的 "S" 。我对这一切都很陌生,任何帮助将不胜感激。

0 投票
0 回答
51 浏览

shell - 使用for循环的多管道

我正在尝试创建一个支持管道和文件重定向的简单外壳。这是我到目前为止提出的执行功能:

当我执行此程序时,程序正在运行,但没有任何反应。我已经研究这个功能好几天了,但似乎无法理解原因。我认为父进程永远在等待孩子。有人可以帮我吗?

0 投票
1 回答
939 浏览

c++ - 尝试使用 execp、dup2 和管道实现 shell,挂起或“错误的文件描述符”

我正在尝试在 C++ 中实现一个带有管道的 shell。我有命令工作,但一旦涉及管道,事情就会停止工作。我会告诉你我的意思。这是代码:

当我运行单管道命令时,比如简单的“ls”,它工作正常。但是,如果我使用 ls | 排序,它给出了这个错误信息:

然后挂起,直到我 ^c 离开那里。我认为挂起来自我以某种方式错误处理管道(没有关闭它们),但我不知道在哪里或多少次将其放入。我认为“无法访问”来自我在能够调用之前丢失 std_in不知何故。我对几乎所有这些功能(dup2、fork、execp、pipe 等)都是新手,所以我觉得我的猜测和检查更像是 6 轮俄罗斯轮盘赌。

无论如何,任何帮助表示赞赏。谢谢!

0 投票
1 回答
582 浏览

c++ - dup2、execv、管道、分叉和​​以错误顺序运行的代码

所以这应该做的是fork,让子进程获取文件的文本,然后让父进程修改该文本并将其写入新文件。我有各种各样的怪异现象。整个代码大致是这样的。

特别麻烦的是三件事,第一,这个代码片段......

...不将“打开的目标文件”写入标准输出。相反,它将它放在 newfile.txt 中,所以 dup2 正在更改出现在它之前的输出命令的输出?...如果我注释掉 dup2,到最后,它不会发生,这绝对是特定的 dup2打电话让它发生。

其次,这个代码片段......

...根本不输出任何关于打开文件的成功/失败。它确实打印出原始文件的内容,并进行了适当的修改,但不会终止。它只是永远存在,直到我使用 ctrl-C 来终止当前进程。不显示最终结果。

最后,这...

...没有给我任何输出,无论是标准输出还是 newfile.txt。

感觉这些系统调用中的一些只是按照他们感觉的任何顺序执行,半独立于我编写它们的顺序,因此几乎不可能对它们做任何事情。