exitとreturnの違い


vfork()でサブプロセスを作成する場合、exit()で終了すると結果は正常で、returnで終了すると異常になります.
なぜそうなったのか、exit()とreturnの違いを分析します.
ソース:
  1 #include
  2 #include
  3 #include
  4 int main()
  5 {
  6     pid_t id = vfork();
  7     if(id<0)
  8     {
  9         perror("fork");
 10         exit(1);
 11     }
 12     else if(id == 0)
 13     {
 14         printf("child
");  15         //exit(1);  16         return 0;  17     }  18     else  19     {  20         printf("father
");  21         //exit(1);  22         return 0;  23     }

returnで終了すると、次のようになります.
father
child
father
child
father
child
father
fork: Resource temporarily unavailable

exitで終了する場合:
[fbl@localhost test4_7]$ ./test
child
father
原因分析:
vfork()で作成されたサブプロセスは、親プロセスとデータセグメントを共有し、サブプロセスが親プロセスより先に実行されることを保証するため、returnは関数の戻りであり、exitは関数スタック空間を解放しません.したがって、サブプロセスのmain関数returnの後、親プロセスはサブプロセスの終了信号を受信してvfork()から戻り始めるが、このとき、親プロセスのスタック空間が解放され、エラーが発生する.
exit()とreturnの違い:
1、returnは関数値を返し、キーワードである.exitは関数です
2、returnは言語レベルであり、呼び出しスタックの戻りを表す.exitはシステム呼び出しレベルであり、プロセスの終了を示す.
3、returnは関数の戻りであり、exitはプロセスの終了である.
4、returnはC言語で提供され、exitはオペレーティングシステムで提供される
5、returnは1つの関数の実行を終了するために使用され、関数の実行情報を他の呼び出し関数に伝達して使用する.exit関数は、アプリケーションを終了し、プロセスで使用されるメモリ領域を削除し、アプリケーションのステータスをOSに返します.
6、exitは一時変数、局所変数の解析方法を呼び出さず、メモリの漏洩を招く可能性がある.