2016-12-29 15 views
0

ファイルを実行し、実行結果を送信する子プロセスを実装する必要があります.2プロセスは共有メモリセグメントと通信します。関数popenを呼び出すプロセスを中断する

私の問題は、10秒後にpopenを呼び出す子プロセスを強制終了したいが、関数popはシグナルを無視するということです。ここで

は私のコード(共有メモリ・セグメントは含まれません)です。

void kill_child(int sig) 
{ 
kill(child_pid,SIGKILL); 
printf("processus killed \n"); 

} 

/*code....*/ 

signal(SIGALRM,(void (*)(int))kill_child); 

if(fork()==0){ 
       res.buffer=true; 
       FILE * fd; 
       char cmd[BUFFER_SIZE],output[BUFFER_SIZE]; 
       strcpy(cmd,"./"); 
       strcat(cmd,res.filepath); 
       system(cmd); 
       if((fd=popen(cmd,"r"))== NULL) 
        exit(1); 
       else 
        res.status=200; 


       strcpy(output,""); 
       while(fgets(buf,sizeof(buf)-1,fd)) 
        strcat(output,buf); 

       if(pclose(fd)) 
        exit(1); 

       strcat(res.customHTML,output); 
       res.buffer=true; 


       int err = sendResponse(res,args->client_fd); 
       if (err < 0) on_error("failed!\r\n"); 



       exit(0); 


} 

else{ 

       int status; 
       alarm(10); 
       waitpid(-1,&status,0); 
       printf("status %d _n); 
} 

子プロセスの中断を行うことができますどのように?

ありがとう

+0

あなたのコードはいつもpopenコールに達していますか?システムを使ってコマンドを実行しているので、実行が完了するまで待ってから続行します。 –

+0

はい、それはpopen呼び出しに達する、私はテストのためだけにシステムを追加しましたが、exemple sleep(12)のために持っているファイルを実行しようとすると; 10秒以上経過すると、プロセスは実行されず、 –

+0

となり、popenをsleep(12)に置き換えた場合、コードは期待通りに機能しますか? –

答えて

1

まず、子PIDをchild_pidに格納する必要があります。親プロセスのフォークから返されますので、フォークコールを

child_pid = fork(); 
if(child_pid == 0) 
    { 
... 

に変更します。それ以外の場合は、killの呼び出しにランダムな値が渡されます。幸運にも、デフォルトで0になっているようです。killは、同じプロセスグループ内のすべてのプロセスを強制終了させて​​、子プロセスを強制終了させることを意味します。

第二

ではなく、popenのを呼び出すには、()この方法であなた...(たとえば)execvpの()を自分で実行ファイルと親が自分で作成し、パイプを使用して出力を読んで持って

int fds[2]; 

pipe(fds); 
child_pid = fork(); 
if(child_pid == 0) 
    { 
    char *cmd[]={"mycmd",NULL}; 

    /* Replace stdout with the output of the pipe and close the original */ 
    dup2(fds[1],1); 
    close(fds[0]); 
    close(fds[1]); 
    execvp(cmd[0],cmd); 
    } 
else 
    { 
    close(fds[1]); 
    alarm(10); 
    while(...) 
    { 
    read(fds[0],....); 
    if(waitpid(child_pid,&status,WNOHANG)) 
     { 
     .... 
     } 
    } 
    } 

を呼び出します実行可能ファイルを実行している子プロセスが1つしかなく、いつ、どのように終了するかについての可視性があります。

+0

ありがとう、それはこのように動作します。 –

+0

私はそれが動作する場合は、答えを受け入れることを意味していると思う:) –

関連する問題