@@ -1604,6 +1604,34 @@ def test_pidfd_open(self):
16041604 self.assertEqual(cm.exception.errno, errno.EINVAL)
16051605 os.close(os.pidfd_open(os.getpid(), 0))
16061606
1607+ @unittest.skipUnless(hasattr(os, "pidfd_getfd"), "pidfd_getfd unavailable")
1608+ def test_pidfd_getfd(self):
1609+ fd = os.open(__file__, os.O_RDONLY)
1610+ self.addCleanup(os.close, fd)
1611+ pidfd = os.pidfd_open(os.getpid(), 0)
1612+ self.addCleanup(os.close, pidfd)
1613+ try:
1614+ dupfd = os.pidfd_getfd(pidfd, fd)
1615+ except OSError as exc:
1616+ if exc.errno == errno.ENOSYS:
1617+ self.skipTest("system does not support pidfd_getfd")
1618+ if isinstance(exc, PermissionError):
1619+ self.skipTest(f"pidfd_getfd syscall blocked: {exc!r}")
1620+ raise
1621+ self.addCleanup(os.close, dupfd)
1622+
1623+ self.assertFalse(os.get_inheritable(dupfd)) # PEP 446
1624+ self.assertEqual(os.fstat(fd), os.fstat(dupfd))
1625+
1626+ with self.assertRaises(OSError) as cm:
1627+ os.pidfd_getfd(-1, 0)
1628+ self.assertEqual(cm.exception.errno, errno.EBADF)
1629+
1630+ with self.assertRaises(OSError) as cm:
1631+ bad_fd = os_helper.make_bad_fd()
1632+ os.pidfd_getfd(pidfd, bad_fd)
1633+ self.assertEqual(cm.exception.errno, errno.EBADF)
1634+
16071635 @os_helper.skip_unless_hardlink
16081636 @os_helper.skip_unless_symlink
16091637 def test_link_follow_symlinks(self):
0 commit comments