I'm trying to pass a file descriptor created using os.open to a multiprocessing child process in spawn mode. The following code will run fine on POSIX systems which default to forking, but it will fail to read the file on Windows which uses spawn: import multiprocessing import os def read_file(fd: int): print(os.read(fd, 1024)) if __name__ == '__main__': with open('test.txt', 'wb') as fp: fp.write(b'hello world') fd = os.open('test.txt', os.O_RDONLY) p = multiprocessing.Process(target=read_file, args=(fd,)) p.start() p.join() > python test3.py b'' The multiprocessing documentation for the spawn method states that: The child process will only inherit those resources necessary to run the process object’s run() method. In particular, unnecessary file descriptors and handles from the parent process will not be inherited. This suggests that sharing file descriptors should not be a technical limitation, but it does not explain how a file descriptor may be marked as "necessary". The documentation for a method I came across called os.set_inheritable states that: A file descriptor has an “inheritable” flag which indicates if the file descriptor can be inherited by child processes. However, calling this method on the file descriptor before spawning a process makes seemingly no difference. Continue reading...