標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.1 |
両方 |
#define _POSIX_SOURCE
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
これらのエレメントの詳細は、times() - プロセスおよび子プロセス時間の取得を参照してください。
その他はすべての点で、子は親と同じです。子は複製であるため、親にあった fork() 呼び出しと同じ呼び出しが、子にも あります。実行はこの fork() 呼び出しから開始され、この呼び出しは値 0 を 戻します。子はその後、通常の実行を続行します。
親プロセスがマルチスレッドである場合、fork() が発生したときにアプリケーション・データの整合状態を保つことは、アプリケーションが行う必要があります。例えば、アプリケーション・データの更新をシリアライズするために使用される mutex は、fork() の前にロックし、その後でアンロックする必要が生じることがあります。
fork() の詳細については、「z/OS UNIX System Services プログラミング: アセンブラー呼び出し可能サービス 解説書) を参照してください。
MVS™ メモリー・ファイルを z/OS®UNIX プログラムから使用できます。しかし、そのプログラムから fork() 関数を使用すると、子プロセスの ハイパースペース・メモリー・ファイルからアクセスが削除されます。そのプログラムから exec 関数を使用すると、プロセス・アドレス・スペースがクリアされたときにメモリー・ファイルはクリアされます。
マルチスレッド環境で fork() の結果として得られる子プロセスは、async-signal-safe 関数のみを呼び出すことができます。
async-signal-safe 関数は、シグナル・キャッチング関数から無制限に呼び出すことができる関数として定義されます。 サポートされる async-signal-safe 関数すべてのリストを、表 1 に示します。
abort() | fpathconf() | raise() | sigpending() |
---|---|---|---|
accept() | fstat() | read() | sigprocmask() |
access() | fsync() | readlink() | sigqueue() |
aio_error() | ftruncate() | recv() | sigset() |
aio_return() | getegid() | recvfrom() | sigsuspend() |
aio_suspend() | geteuid() | recvmsg() | socket() |
alarm() | getgid() | rename() | socketpair() |
bind() | getgroups() | rmdir() | stat() |
cfgetispeed() | getpeername() | select() | symlink() |
cfgetospeed() | getpgrp() | send() | sysconf() |
cfsetispeed() | getpid() | sendmsg() | tcdrain() |
cfsetospeed() | getppid() | sendto() | tcflow() |
chdir() | getsockname() | setgid() | tcflush() |
chmod() | getsockopt() | setpgid() | tcgetattr() |
chown() | getuid() | setsid() | tcgetpgrp() |
close() | kill() | setsockopt() | tcsendbreak() |
connect() | link() | setuid() | tcsetattr() |
creat() | listen() | shutdown() | tcsetpgrp() |
dup() | lseek() | sigaction() | time() |
dup2() | lstat() | sigaddset() | times() |
execle() | mkdir() | sigdelset() | umask() |
execve() | mkfifo() | sigemptyset() | uname() |
_Exit() | open() | sigfillset() | unlink() |
_exit() | pathconf() | sigismember() | utime() |
fchmod() | pause() | sleep() | wait() |
fchown() | pipe() | signal() | waitpid() |
fcntl() | poll() | sigpause() | write() |
fork() |
相互運用性の制約事項: POSIX リソースでは、fork() は記述どおりに動作します。しかし、通常は親に存在する MVS リソースは、子には存在しません。これは、MVS データ・セットのオープン・ストリームや STIMERS のようなアセンブラー・アクセスの MVS 機能に該当します。さらに、MVS 割り振り (JCL、SVC99、または ALLOCATE による) は、子プロセスには受け渡されません。
fork() は、正常終了時には子プロセスへ 0 を戻し、新規に作成した子 のプロセス ID を親プロセスへ戻します。
⁄* CELEBF27
This example creates a new child process.
*⁄
#define _POSIX_SOURCE
#include <sys⁄types.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys⁄wait.h>
main() {
pid_t pid;
int status;
if ((pid = fork()) < 0)
perror("fork() error");
else if (pid == 0) {
puts("This is the child.");
printf("Child's pid is %d and my parent's is %d¥n",
(int) getpid(), (int) getppid());
exit(42);
}
else {
puts("This is the parent.");
printf("Parent's pid is %d and my child's is %d¥n",
(int) getpid(), (int) pid);
puts("I'm waiting for my child to complete.");
if (wait(&status) == -1)
perror("wait() error");
else if (WIFEXITED(status))
printf("The child exited with status of %d¥n",
WEXITSTATUS(status));
else
puts("The child did not exit successfully");
}
}
This is the parent.
This is the child.
Child's pid is 1114120 and my parent's is 2293766
Parent's pid is 2293766 and my child's is 1114120
I'm waiting for my child to complete.
The child exited with status of 42