@@ -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