2

C を使用して、父親のことを考えずにビジネスを行う独立した子プロセスを生成するにはどうすればよいでしょうか?

いくつかのプロセスを生成したいのですが、それらが作成された直後に、それらは仕事をする前に約2分間スリープします。

ただし、その間にさらにプロセスを生成したいので、子が完了するまで父親を待たせたくありません。

私はLinuxを使用しています。

4

3 に答える 3

2

を使用して必要なだけプロセスを生成し、親プロセスfork(2)を呼び出すだけです。exit()孤立した子供たちは、initプロセスによって採用されます。

于 2011-05-15T12:15:10.043 に答える
2

fork() を使用します。 fork() システムコール

pid_t pid = fork (); 
if (pid < 0) 
  // Error
else if (pid == 0) 
  // Child Process
  // Sleep 2 min. ?!
else 
  // Code for Father
于 2011-05-15T12:18:02.903 に答える
2

作成直後に「独自のビジネス」を行う複数の子プロセスを作成する場合は、vfork()(親プロセスのアドレス空間を完全にコピーせずに新しいプロセスを作成するために使用される) とexec()ファミリを使用して、子プロセスのイメージを次のように置き換える必要があります。あなたが望むものなら、なんでも。

子が終了するまで親を待たせたくない場合は、非同期シグナル処理を利用する必要があります。子プロセスが終了すると、SIGCHLD が送信されます。したがってwait()、親プロセスではなく SIGCHLD のシグナル ハンドラー内に配置し、シグナル ハンドラーに子プロセスの戻りステータスを収集させることができます。

以下はおもちゃの例です。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>

sig_atomic_t child_process_ret_status;

void spawn(char *program,char *argv[]){
    pid_t child_pid=vfork();

    if(child_pid>0){
        printf("the parent process pid: %d\n",(int)getpid());
        printf("the cpid: %d\n",(int)child_pid);
        system("ping -c 10 www.google.com");
    }else{
        printf("the new process %d is going to execute the new program %s\n",(int)getpid(),program);
        execvp(program,argv);
        printf("you'll never see this if everything goes well.\n");
    }
}


void child_process_ret_handle(int sigval){
    if(sigval == SIGCHLD){
        printf("SIGCHLD received !\n");
        wait(&child_process_ret_status);
    }
}

int main(void){
    signal(SIGCHLD,child_process_ret_handle);
    char *program="sleep";
    char *argv[]={
        "sleep",
        "5",
        NULL
    };

    spawn(program,argv);
    if(WIFEXITED (child_process_ret_status)){
        printf("child process exited successfully with %d\n",WEXITSTATUS (child_process_ret_status));
    }else{
        printf("the child process exited abnormally\n");    
    }

    printf("parent process: %d returned!\n",getpid());
    return 0;
}
于 2011-05-15T13:25:59.013 に答える