【问题标题】:Ensuring that parent process terminates before child确保父进程在子进程之前终止
【发布时间】:2013-02-04 13:30:52
【问题描述】:

如果我在fork 之后在子级中使用以下行:

while( getppid() != 1 )

为了确保父进程在子进程之前终止(当父进程终止时,子进程的父进程变为init 进程)那么我可能面临哪些问题(如果有的话)?

这是确保孩子在父母之后终止的好方法吗?

还有什么办法?

【问题讨论】:

    标签: c linux pid


    【解决方案1】:

    自旋循环从来都不是一件好事。分叉前打开管道。让孩子阻止阅读。当父级终止时,管道将关闭,子级将继续。 (确保孩子关闭管道的写入端!)

    例如:(警告:省略所有错误检查)

    int
    main( void ) {
        int fd[ 2 ];
        pipe( fd );
        if( fork() ) {
            sleep( 2 );
            puts( "parent awakes" );
        } else {
            char k;
            close( fd[ 1 ]);
            read( fd[ 0 ], &k, 1 );
            puts( "child continues" );
        }
        return 0;
    }
    

    还要注意,子进程完成后应该关闭管道的读取端,但我已将其从示例代码中删除,因为它与等待父进程终止的问题无关。

    【讨论】:

    • “自旋循环从来都不是一件好事。”为什么是我想知道的。
    • 这是对cpu周期的浪费。它们在用户空间代码中几乎从不需要。 (我保守地说“几乎从不”。我的意思是“绝对从不”,但我对我错的可能性持开放态度。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多