サーチ…


構文

  • 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失敗した場合、 errnoEAGAINまたは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