fork()
またはforkpty()
が続いていると仮定しexeclp()
ますexecvp()
。基本的に、返されるかどうかを確認する必要がありexec?p()
ます(失敗した場合にのみ返されます)。その場合は、失敗が発生したことを親プロセスに通知するだけです。これを行う 1 つの方法は、exit()
ステータスを使用することです。親はwait()
、子プロセスをリープするために使用することで、このステータスを取得できます。
#define EXEC_FAIL_MAGIC 177
void edit (const char *e) {
int status = 0;
pid_t p = fork();
switch (p) {
default: /* parent */
while (wait(&status) != p) {}
break;
case 0: /* child */
execlp(e, e, "foo.txt", (char *)0);
exit(EXEC_FAIL_MAGIC);
case -1: /* error */
fail("fork() failed");
}
if (!WIFEXITED(status)) fail("abnormal termination of editor");
if (WEXITSTATUS(status) == EXEC_FAIL_MAGIC) fail("execlp failed");
if (WEXITSTATUS(status) != EXIT_SUCCESS) fail("editor had failure");
}