4

だから私はCで基本的なUNIXシェルを設計しています.

    signal(SIGCHLD, handler);
        pid = fork();
        switch (pid) {
        case -1: printf("Fork failed; cpid == -1\n");
        break;

        case 0: child_pid = getpid();
                argv[0] = prog;
        argv[1] =NULL;
        //exit(0);
        sid = setsid();
        execv(absPath,argv);        
        //printf("%d: this is the child, pid = %d\n", i, child_pid);
        //sleep(1);
        //exit(0);
        break;

        default: printf("This is the parent: waiting for %d to finish\n", pid);
        waitpid(pid, NULL, WNOHANG);
        printf("Ttttthat's all, folks\n");
        //break;
        }
        //execv(absPath,argv);
        //printf("CHILD PROCESS");
    }

}
void handler(int sig)
{
  pid_t pid;

  pid = wait(NULL);

  printf("Pid %d exit.\n", pid);
  exit(0);
}

ただし、「デフォルト」句の後ではありますが、フォークされたプロセスは同じシェルで実行されます。

バックグラウンド プロセスとして実行するのを手伝ってもらえますか? ありがとう!

PS: これはほんの一部です。

4

2 に答える 2

2

いくつかの明らかなエラーについてコメントします。

  • 子プロセスで実行するexit(0);と、子プロセスがすぐに終了します。この行を削除します。
  • 明確にするために、execv()このように呼び出す必要があると思いますexecv(argv[0], argv);

編集: 子プロセスからの fork に関する問題を解決するには、以下をお読みください。

于 2012-04-25T08:38:13.860 に答える
1

Fat Controller アプリケーションの一部として、プロセスをデーモン化するライブラリを作成しました。ソースをダウンロードして、daemonise.c を見てください。比較的よくコメントされているはずですが、さらに質問があれば、喜んでお手伝いします。

http://sourceforge.net/projects/fat-controller/files/

于 2012-04-25T08:24:27.160 に答える