-2

プログラムを書きました

#include <stdio.h>
#include <unistd.h>

int main()
{
    int returnVal = fork();
    printf("Return Value: %i\n", returnVal);
    return 1;
}

これをコンパイルして実行すると、次の出力が得られます。printfステートメントを1つだけ指定したのに、なぜ2つのプリントが表示されるのですか。印刷を削除すると、何も印刷されません。

alwin@alwin-desktop:~/Projects/Nix$ ./a.out 
Return Value: 5547
Return Value: 0
4

3 に答える 3

7

man コマンドを実行する必要があります :-)

小切手:pid_t fork(void);

fork()、呼び出しプロセスを複製して新しいプロセスを作成します。子と呼ばれる新しいプロセスは、親と呼ばれる呼び出しプロセスの正確な複製です。

詳細:: まず、子プロセスを作成するコードを実行しました。これで、同じコードを実行する 2 つのプロセスができました。したがって、最初は親プロセス、2 番目は子プロセスの 2 つの print ステートメントです。

于 2013-01-19T12:53:03.937 に答える
6

fork が成功すると、プログラムは(およびプロセスによって制御されるため)、プログラム内のprintfステートメントが実行されます。したがって、ここでの printf は、子プロセスと親プロセスの両方によって実行されます。twicetwo processeschildparent

このような動作を避けるために、fork() を使用してプログラムで 3 つの異なる条件チェックを行うことは常に良いことです。

int pid;
if((pid = fork()) == -1 )
{ //fork unsuccessful 
 }
else if ( pid > 0)
{ //This is parent
 }
else
{//This is child
 }
于 2013-01-19T13:00:54.307 に答える
5

fork新しいプロセスを作成します。したがって、次のステートメントを実行するプロセスが 2 つあります。親プロセスにはreturnVal = 5547(子プロセスの PID) と子プロセスがありますreturnVal = 0

関数はfork()新しいプロセスを作成します。新しいプロセス (子プロセス) は、呼び出しプロセス (親プロセス) の正確なコピーでなければなりません。

于 2013-01-19T12:51:37.367 に答える