スポンサーリンク

このドキュメントの内容は、以下の通りです。

はじめに

FreeBSD(UnixやLinux)では、新しいプロセス(子プロセス)をforkシステムコールを用いて作成します。子プロセスを作成し、子プロセスに処理をさせているときに、親プロセスが子プロセスの終了を待ちたいときがあります。

子プロセスが終了したことを調べる方法、検知する方法がいくつかあります。今回は、waitシステムコールによる子プロセスの終了を待つ方法について、解説します。

書式


wait()システムコールのプロトタイプを以下に示します。。

#include <sys/types.h>
#include <sys/wait.h>

pid_t
wait(int *status);

statusには、子プロセスのステータス(終了情報)が格納されます。

戻り値


戻り値 説明
-1 なんらかのエラーが起きた場合。
それ以外 終了した子プロセスのPID(プロセスID)が返ります。


サンプルコード

forkで子プロセスを作成し、子プロセスの中で長い処理(今回はとりあえずsleepさせるだけ)をさせます。親プロセスは、子プロセスの終了を待ち、子プロセスの終了ステータスを表示します。

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

#include <sys/types.h>	// fork/wait
#include <unistd.h>	// fork/sleep
#include <sys/wait.h>	// fork/wait

#include <err.h>
#include <errno.h>

int
main(int argc, char *argv[])
{
	int	status = 0;
	pid_t	wait_pid;
	pid_t	pid;

	pid = fork ();

	if (-1 == pid)
	{
		err (EXIT_FAILURE, "can not fork");
	}
	else if (0 == pid)
	{
		// child
		(void) puts ("child start");
		sleep (5);	// 子プロセスの長い処理
		(void) puts ("child end");
		exit (EXIT_SUCCESS);
		/* NOTREACHED */
	}

	// parent
	(void) printf ("parents, child is %d\n", pid);
	wait_pid = wait (& status);

	if (wait_pid == -1)
	{
		// wait が失敗した
		err (EXIT_FAILURE, "wait error");
	}

	(void) printf ("child = %d, status=%d\n", wait_pid, status);

	exit (EXIT_SUCCESS);
}

コンパイル方法

コンパイル方法は以下の通りです。
cc wait.c

実行例

実行方法は以下の通りです。
% ./a.out
parents, child is 58820
child start
parents pid 58819
child end
child = 58820, status=0
参照しているページ (サイト内): [2008-06-17-2] [2007-12-23-2] [2007-12-23-1]

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー