読者です 読者をやめる 読者になる 読者になる

パイプを開くとファイルが消せない

ハマった…。知らんかった…。しかもC++でも同じ挙動とは…。WINだけ?
パイプでプロセスを開くときは事前に不要なファイルを閉じなくてはいけないみたい。
ファイルの変換処理をテンポラリファイル経由で大量に走らせつつパイプで子プロセスに処理させたら削除エラー出まくりでした。

import os,time,subprocess as sp

if __name__ == '__main__':

    fp = open('.hoge', 'wb')
    fp.write('hoge hoge hoge')
    fp.flush()

    # proc = sp.Popen('cat', close_fds=True) ### 問題なし
    proc = sp.Popen('cat', stdin=sp.PIPE) ### 削除できなくなる
    fp.close()
    os.remove('.hoge')

    proc.kill()
    proc.wait()

C++版。これも消せなくなる。

#include <stdio.h>

int main(int, const char**)
{
    FILE* fp = fopen(".hoge", "wb");
    fwrite("xxx", 3, 1, fp);
    fflush(fp);

    FILE* proc = _popen("C:\\cygwin\\bin\\cat.exe", "wb"); // vc用なので _popen
    if(!proc){
        printf("errr\n");
        return 10;
    }
    fwrite("hoge hoge hoge", 4, 1, proc);

    fclose(fp);
    int ret = remove(".hoge"); // エラーになる
    printf("remove: %d\n", ret);

    _pclose(proc);

    return 0;
}