0

私はLinuxでのプログラミングに不慣れで、fork()関数とexec関数がどのように機能するかを理解しようとしていました。自分で簡単にするために、単純なDummy実行可能ファイル(gcc -o Dummy.exe ...を使用)を作成し、fork関数を呼び出して、作成したDummy.exe実行可能ファイルで子を置き換えることができるようにしました。

私が遭遇している問題は、コードを実行すると、Dummy.exeの内容が表示されることですが、それ以降は何も表示されません。つまり、親プロセスが終了することはありません。

コードEx1.cppを実行すると、次の出力が得られます。

    Program is Running
    --- ****** ---
    Ended

    me@mdev>

プログラムを終了させる唯一の方法は、リターンキーを押すことです。Endedという単語の後に空白行が表示されます。

これが私のEx1.cppのコードです

#include <iostream>
using namespace std;

int main()
{
        pid_t retVal;
        int newStatus;

        switch(retVal = fork())
        {
                case -1:
                cout<<"Error occured with fork"<<endl;
                break;
                case 0:
                cout<<"Child forked"<<endl;
                newStatus = execl("Dummy.exe","Dummy.exe", NULL);
                break;
                default:
                cout<<"Parent has a new child: "<<retVal<<endl;
        }

        cout<<"Ended ..."<<endl;
        return 0;
}

私のDummy.cppコードは以下のとおりです。

#include <iostream>
using namespace std;

int main()
{
        cout<<"Program is Running"<<endl;
        cout<<"--- ****** ---"<<endl;
        cout<<"Ended"<<endl;

        return 0;
}

私のバックグラウンドはWindows開発であり、これはすべて私にとって新しいことです。ご協力に感謝します。

4

1 に答える 1

0
#include <iostream>

名前空間stdを使用します。

int main(){pid_t retVal;

    int newStatus;

    int returnStatus;

    if (retVal = fork() < 0)
    {
        cout << "Error on fork" << endl;
        exit (1);
    }   

    // Child process
    else if (retVal == 0)
    {
        // No code is executed after an exec statement
        newStatus = execl("./Dummy", "Dummy", NULL);
    }


    else
    {
        // This waits for the child to finish and clean up
        waitpid(retVal, &returnStatus, NULL);
    }

return returnStatus;

}

execステートメントの後にコードが実行されないため、この場合はswitchステートメントを使用することはお勧めできません。man 2 execと入力して、コマンドプロンプトのmanページを読むと、さらに詳しく知ることができます。また、waitpid関数が行うことである、子が正常に終了するのを待つことは常に良い考えです。これを試して、それが機能するかどうか、また質問がある場合はお知らせください。

于 2012-06-29T17:30:47.633 に答える