rabbitfoot530's diary

読んだ本と、プログラムに関することのメモです。好きな言語は、C++, Python, Golang, TypeScript。数学・物理・学習理論も好きです。

PythonによるLinuxプログラミングインタフェース(5章 dup)

 5章P103のduppythonコード。

#/usr/bin/env
#-*- encoding: utf-8 -*-
import os


def pythonic():
    def run():
        py_dup()
        py_dup2()

    def py_dup():
        newfd = os.dup(1)
        print("newfd: " + str(newfd))
        os.close(2)
        newfd = os.dup(1)
        print("newfd: " + str(newfd))

    def py_dup2():
        file = open(__file__)
        fd = file.fileno()
        newfd = 1000
        os.dup2(fd, newfd)
        print(fd)
        print(newfd)
        str = os.read(newfd, 100)
        print(str)

    return run

if __name__ == '__main__':
    pythonic()()
    #run = pythonic()
    #run()

os.dupにて、引数に与えたファイルディスクリプタをコピーする。 今回は書き込みのfdの1をコピー。 この時点でnewfdは、1のコピーとなる。

そして、os.dup2にてfdにopenしたファイルのファイルディスクリプタを与えて、newfdに適当な1000を入れておいて、os.dup2にてfdをnewfdにコピーすると、newfdはfdを指しているので、newfdをreadすると当然、fdでopenしたファイルの内容が表示される。