New GitHub issue #100005 from vstinner:<br>

<hr>

<pre>
I propose to skip test_cmd_line_script.test_script_as_dev_fd() on FreeBSD. Here is why.

cc @Jehops @emaste @koobs

The test added by PR #99768 fails on FreeBSD. test_cmd_line_script.test_script_as_dev_fd() fails with:

```
FAIL: test_script_as_dev_fd (test.test_cmd_line_script.CmdLineTest.test_script_as_dev_fd)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/home/buildbot/python/3.x.koobs-freebsd-9e36.nondebug/build/Lib/test/test_cmd_line_script.py", line 766, in test_script_as_dev_fd
    self.assertEqual(out, b"12345678912345678912345\n")
AssertionError: b"/usr/home/buildbot/python/3.x.koobs-free[94 chars]ry\n" != b'12345678912345678912345\n'
Stderr:
/usr/home/buildbot/python/3.x.koobs-freebsd-9e36.nondebug/build/Lib/subprocess.py:849: RuntimeWarning: pass_fds overriding close_fds.
  warnings.warn("pass_fds overriding close_fds.", RuntimeWarning)
```

Note: Failure first reported in issue #99985.

FreeBSD /dev/fd/ behaves differently than Linux /dev/fd/. I'm not sure why. If the parent opens a file and the file descriptor is inherited, the child process can open the file, but /dev/fd/ only contains file descriptors 0, 1, 2. Example:

parent.py:

```
import subprocess
import sys

script = 'print("Hello")'

script_name = 'script.py'
with open(script_name, 'w') as fp:
    fp.write(script)

with open(script_name, "r") as fp:
    fd = fp.fileno()
    print("FD", fd)

    cmd = [sys.executable]
    p = subprocess.Popen(cmd, close_fds=False, pass_fds=(0, 1, 2, fd))
    p.wait()
```

Child process:

```
$ ./python y.py 
FD 3

/usr/home/vstinner/python/main/Lib/subprocess.py:849: RuntimeWarning: pass_fds overriding close_fds.
  warnings.warn("pass_fds overriding close_fds.", RuntimeWarning)

Python 3.12.0a2+ (heads/main:e3a3863cb9, Dec  5 2022, 12:09:39) [Clang 13.0.0 (git@github.com:llvm/llvm-project.git llvmorg-13.0.0-0-gd7b669b3a3 on freebsd13
Type "help", "copyright", "credits" or "license" for more information.
>>> import os

# The process has 4 file descriptors:
>>> fd=os.dup(0); os.close(fd)
>>> fd=os.dup(1); os.close(fd)
>>> fd=os.dup(2); os.close(fd)
>>> fd=os.dup(3); os.close(fd)

# But /dev/fd/3 doesn't exist
>>> os.listdir("/dev/fd")
['0', '1', '2']

>>> f=open("/dev/fd/3", "rb")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/dev/fd/3'

# Using directly file descriptor 3 works as expected:
>>> f=open(3, "rb")
>>> f.close()
```
</pre>

<hr>

<a href="https://github.com/python/cpython/issues/100005">View on GitHub</a>
<p>Labels: type-bug</p>
<p>Assignee: </p>