[Issue 23684] New: std.process.spawnProcess fails if ulimit is too large
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Fri Feb 10 23:58:52 UTC 2023
https://issues.dlang.org/show_bug.cgi?id=23684
Issue ID: 23684
Summary: std.process.spawnProcess fails if ulimit is too large
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Severity: major
Priority: P1
Component: phobos
Assignee: nobody at puremagic.com
Reporter: d.bugs at webfreak.org
This code fails:
```d
import std.process;
void main()
{
auto pid = spawnProcess(["ls"]);
while (true) {}
}
```
with
`std.process.ProcessException at std/process.d(1196): Failed to allocate memory
(Cannot allocate memory)`
when the ulimit max open files, divided by 8, is equal or larger than the
available memory.
This happened when trying to spawn a process inside a docker container:
install rocky linux (rhel) 768M mem + 768M swap
install docker
docker run --rm -it debian:bullseye
apt-get update && apt-get install -y gcc ldc
create d file
ldc2 -run test.d
Problem: it tries to allocate `RLIMIT_NOFILE * pollfd.sizeof` bytes to pass to
poll to try which FDs are open to close them to not accidentally inherit them.
However RLIMIT_NOFILE is on this platform = 1073741816
Workaround: Config.inheritFDs will make std.process not try to close them, thus
avoiding the malloc, thus avoiding the crash.
There should probably be a check if RLIMIT_NOFILE is very big and in that case
probably try to chunk the polling or do a brute force approach or just see how
other standard libraries implemented this issue.
--
More information about the Digitalmars-d-bugs
mailing list