问题标签 [fork]

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 投票
3 回答
1812 浏览

unix - 使用 fork 和套接字时处理不正常的关闭

我有一个服务器,它监听套接字连接并根据请求执行不同类型的操作。其中之一是长期存在的数据库查询,服务器为此分叉。

服务器保留所有活动子节点的日志,并且每当被要求关闭时,它会在退出之前杀死所有子节点。有几次我遇到服务器崩溃或被不优雅地杀死的情况,这导致子进程成为孤儿。如果我再次尝试恢复服务器,它将拒绝说监听套接字无法绑定,因为该地址/端口已经绑定。

我正在寻找一种方法来改善这种情况,以便主服务器进程可以立即恢复。我已经尝试从孩子那里监视父母的存在并在消失后立即退出,但这只会导致僵尸进程并且套接字似乎仍然被绑定。

该服务器是用 Python 编写的,但欢迎任何语言的任何解释或建议。

0 投票
4 回答
15889 浏览

python - 使用 os.pipe 和 os.fork() 问题的 Python 程序

我最近需要编写一个脚本来执行os.fork()以拆分为两个进程。子进程成为服务器进程并使用使用os.pipe()创建的管道将数据传递回父进程。像往常一样,孩子关闭'r'管道的末端,父母关闭管道的'w'末端。我使用os.fdopen将 pipe() 的返回转换为文件对象。

我遇到的问题是:进程成功分叉,孩子成为服务器。一切正常,孩子尽职尽责地将数据写入'w'管道的开放端。不幸的是,管道的父端做了两件奇怪的事情:
A)它阻塞了管道末端的read()操作'r'。其次,除非末端完全关闭
,否则它无法读取放在管道上的任何数据。'w'

我立即认为缓冲是问题并添加了pipe.flush()调用,但这些没有帮助。

谁能解释为什么在写入端完全关闭之前数据不会出现?是否有使read()呼叫非阻塞的策略?

这是我第一个分叉或使用管道的 Python 程序,如果我犯了一个简单的错误,请原谅我。

0 投票
2 回答
2182 浏览

perl - 如何在 Perl 的分叉进程中共享数据库连接?

我之前在 Perl 中制作了以下程序:

我认为它等待子进程的结束想要这样做,并会通过一个亲进程为 DB 操作它。

另外,DB没有连接到内容的错误。

怎么了?

0 投票
4 回答
106977 浏览

c - 多个子进程

有人可以帮助我了解如何创建具有相同父级的多个子进程以完成特定工作的“某些”部分吗?

例如,应用于子进程的外部排序算法;每个子进程对一部分数据进行排序,最后父进程合并它们。

编辑:也许我应该提到带有循环的分叉多个子进程..

0 投票
4 回答
2622 浏览

c - 多个子进程+从流中读取

参考我的最后一个问题(多个子进程),我现在正在尝试使用多个子进程进行外部排序实现。

但当然,由于 fscanf,这段代码会从 inputfile 输出相同的排序整数序列。例如,如果输入文件的开头包含 5 1 4,那么它会输出:

(第一个孩子) 1 4 5
(第二个孩子) 1 4 5

(有两个子进程).. 因为 fscanf 从输入流的开头开始读取整数。

我现在的问题是如何继续从前一个子进程离开的点开始读取数字?例如,如果输入文件包含 5 1 4 8 5 10,那么它可以输出:

(第 1 个孩子) 1 4 5

(第二个孩子) 5 8 10

提前致谢;)

0 投票
3 回答
62389 浏览

c - 如何退出子进程并从 execvp() 返回其状态?

在我的简单自定义 shell 中,我从标准输入读取命令并使用 execvp() 执行它们。在此之前,我创建当前进程的一个分支,并在该子进程中调用 execvp(),之后,我调用 exit(0)。

像这样的东西:

现在,使用 execvp() 运行的命令可以返回错误,对吧?我想正确处理这个问题,现在我总是调用 exit(0),这意味着子进程将始终处于“OK”状态。

如何从 execvp() 调用中返回正确的状态并将其放入 exit() 调用中?我是否应该只获取 execvp() 返回的 int 值并将其作为 exit() 参数而不是 0 传递。这是否足够且正确?

0 投票
2 回答
31142 浏览

unix - 在不同进程之间传递文件描述符的可移植方式

在大多数 UNIX 系统上,通过 fork() 可以轻松地为子/父进程在进程之间传递打开的文件;但是我需要在孩子已经分叉之后分享一个 fd。

我发现一些网页告诉我 sendmsg() 可能适用于任意进程;但这似乎非常依赖于操作系统并且很复杂。portlisten似乎是我能找到的最好的例子,但我更喜欢像 libevent 这样的好的包装库,它隐藏了 kqueue、pool 等的所有魔力。

有谁知道是否有一些图书馆(和便携式方式)可以做到这一点?

0 投票
6 回答
31835 浏览

c - 在 C 中使用 fork()、pipe()、dup2() 和 exec() 时遇到问题

这是我的代码:

(代码已更新以反映他下面两个答案提出的更改,它仍然无法正常工作......)

这是失败的测试用例:

问题是我应该在那之后返回我的shell,我应该看到“Shell>”等待更多输入。您还可以注意到,您没有看到类似于“[4804] TERMINATED (Status: 0)”(但 pid 不同)的消息,这意味着第二个进程没有终止。

我认为它与 grep 有关,因为它有效:

您可以轻松地看到两个“终止”消息...

那么,我的代码有什么问题?

0 投票
3 回答
1224 浏览

c - 从另一个 C 进程创建一个新的独立进程

存在两个 C 可执行文件 A 和 B。A 和 B 通过套接字相互通信。

B可以独立启动,也可以通过A启动。

  1. 如果先启动 B,然后再启动 A,则 A 和 B 可以正常启动而不会出现问题。即使A重新启动,也没有问题。

  2. 如果 B 通过 A 启动,则 A 和 B 正常启动。但是这里的通讯口绑定了A和B。这里如果A重启了,那么A就启动失败了。

由于 B 是通过 A 启动的,因此进程 A 是进程 B 的父进程。

那么,有没有什么方法可以让进程 B 独立于进程 A 启动呢?

我们尝试使用fork,但是当我们尝试启动exe时使用fork,正在启动两个进程而不是一个。

0 投票
3 回答
3004 浏览

perl - 为什么我的 Perl 程序在 fork 后没有收获子进程?

我一直在尝试使用 Perl 编写一个简单的 ping 扫描仪供内部使用。由于它扫描 24 位 CIDR 网络,因此如果它在单个线程中运行,则该脚本需要很长时间才能运行。我曾尝试添加 fork 功能来加快进程,但我的第一次尝试几乎花费了相同的时间,因为在任何给定时间只有一个子进程处于活动状态。

我在perlipc文档和Perl Cookbook中阅读了子进程,并提出了第二个版本:

当我扫描我的内部网络时,输出是:

从结果中可以看出,成功扫描的线程打印“up”消息,干净地退出并被父进程收割。同时,其他 251 个线程悬空连接到 '/sbin/init',这可以从快速的 'ps -ef' 列表中看出。如果我在退出语句之前的子处理块中添加一个'print "Child: $currIPending\n"',我会在我的 perl 脚本退出“之后”从终端上的剩余 251 个进程中获得输出。

这里发生了什么?我认为 $SIG{CHLD} 子例程与 waitpid 循环相结合将获得所有子进程并确保系统中没有僵尸/悬空进程。

同时,我还希望能够在任何给定时间运行特定数量的子进程,例如,'n' 个子进程同时运行,每当一个退出父进程时,如果需要,则启动另一个子进程但没有更多在任何特定时刻都比'n'个孩子。这可能吗?如果是,我可以得到一些伪代码来帮助指导我吗?