サーチ…
構文
- pid_t getpid(void);
- pid_t getppid(void);
- pid_t fork(void);
- pid_t waitpid(pid_t pid、int * wstatus、intオプション);
- int execv(const char * path、char * const argv []);
パラメーター
関数、パラメータ、戻り値 | 説明 |
---|---|
fork() | 関数名 |
無し | 該当なし |
PID、0、または-1を返します。 | 呼び出しプロセスは、新しく作成されたプロセスのPIDを受け取るか、失敗した場合は-1を受け取ります。子プロセス(新しく作成されたプロセス)は0を受け取りerrno 失敗した場合、 errno にEAGAIN またはENOMEM いずれかをerrno します |
- | - |
execv() | 関数名 |
const char *path | 実行可能ファイルの名前を含む文字列(inlcudeパス) |
char *const argv[] | 引数としての文字列ポインタの配列 |
失敗したら-1を返します | 成功すると、この関数は戻りません。 |
- | - |
子プロセスを作成し、終了するまで待機する
このプログラムは、 fork()
を使って別のプロセスを実行し、 waitpid()
を使ってその終了を待つ方法を示します:
fork()
は、現在のプロセスと同じコピーを作成します。元のプロセスは親プロセスであり、新しく作成されたプロセスは子プロセスです。両方のプロセスはfork()
後に正確に続行されます。waitpid()
は、子プロセスが終了するか終了し、終了コードと終了理由を返すまでブロックします。
#include <unistd.h> /* for fork(), getpid() */
#include <sys/types.h> /* for waitpid() */
#include <sys/wait.h> /* for waitpid() */
#include <stdlib.h> /* for exit() */
#include <stdio.h> /* for printf(), perror() */
int
main(int argc, char *argv[])
{
/* Create child process.
*
* On success, fork() returns the process ID of the child (> 0) to the
* parent and 0 to the child. On error, -1 is returned.
*/
pid_t child_pid = fork();
if (child_pid < 0) {
perror("fork() failed");
exit(EXIT_FAILURE);
} else if (child_pid == 0) {
/* Print message from child process.
*
* getpid() returns the PID (process identifier) of current process,
* which is typically int but doesn't have to be, so we cast it.
*
* getppid() returns the PID of the parent process.
*/
printf("from child: pid=%d, parent_pid=%d\n",
(int)getpid(), (int)getppid());
/* We can do something here, e.g. load another program using exec().
*/
exit(33);
} else if (child_pid > 0) {
/* Print message from parent process.
*/
printf("from parent: pid=%d child_pid=%d\n",
(int)getpid(), (int)child_pid);
/* Wait until child process exits or terminates.
*
* The return value of waitpid() is PID of the child process, while
* its argument is filled with exit code and termination reason.
*/
int status;
pid_t waited_pid = waitpid(child_pid, &status, 0);
if (waited_pid < 0) {
perror("waitpid() failed");
exit(EXIT_FAILURE);
} else if (waited_pid == child_pid) {
if (WIFEXITED(status)) {
/* WIFEXITED(status) returns true if the child has terminated
* normally. In this case WEXITSTATUS(status) returns child's
* exit code.
*/
printf("from parent: child exited with code %d\n",
WEXITSTATUS(status));
}
}
}
exit(EXIT_SUCCESS);
}
出力例:
from parent: pid=2486 child_pid=2487
from child: pid=2487, parent_pid=2486
from parent: child exited with code 33
もともとM.Geigerによって作成された 、 ここからコピーされました。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow