0

子供をフォークし、キーボードから最大10秒までint番号を取得するacプログラム。10秒後に読み取りを停止し、数値が読み取られたかどうかを確認します。何も読み取られない場合は息子を終了します。それ以外の場合は、読み取られた数値を印刷します。画面が終了し、結果は表示されません。

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



int status,j,i=0;
pid_t son1, son2;
int string[20];
char s[5];


void handler(int signum)
{
if(i==0)
kill(son1,SIGKILL);
}

void signal_handler_1(int sig_num)
{
  printf("\nI sent the signal SIGUSR1 to my child\n");

}


main(){

    son1=fork();
     if(son1==0)
     {
        signal(SIGUSR1 , signal_handler_1);
        printf("I'm son1, my id is: %d\n", getpid());

      pause();
        printf("I'm son1 exitting: %d\n", getpid());

      exit(1);

    }
    if(son1>0){

    printf("I'm father, my id is: %d\n", getpid());
    signal(SIGALRM,handler);

         alarm(10);//how can i terminate the reading process after alarm??

               while(fgets(s,5,stdin)!=NULL)
                {
                  sscanf(s,"%d",&string[i]);
                  i++;
                }


              for(j=0;j<i;j++)
                printf("%d\n",string[j]);

              kill(son1,SIGUSR1);


              wait(&status);


    }
    return 0;
}
4

1 に答える 1

0

親は、SIGALRMのシグナルハンデラーを実行した後、whileループに戻ります。

また、linkddが言ったように、問題をより詳細に説明してください。

あなたのコードでは、親はSIGKILLを子に送信し、親がスタックしているため、それは機能しなくなります。つまり、「ゾンビ」になります。親は10秒が経過したことに気付かず、入力を永久に読み取ります。

最も美しい方法ではありませんが、これでうまくいきます。

グローバルを定義する

int alarm_received = 0;

親信号ハンデラーを編集して、アラームが鳴ったときにフラグを設定します。

void handler(int signum)
{
    if(i==0){
        kill(son1,SIGUSR1);
    }
    alarm_received = 1;
}

子シグナルハンデラーはこのようになります。シグナルハンデラー内でprintfを呼び出すのは良くありません。

void signal_handler_1(int sig_num)
{
    char msg[] = "Child received SIGUSR1\n";
    write(STDOUT_FILENO, msg, sizeof(msg));
}

whileループを変更して、信号が送信されたかどうかを確認します。したがって、親は立ち往生しません。

while(alarm_received == 0)
{
    fgets(s,5,stdin);
    sscanf(s,"%d",&string[i]);
    i++;
}

そのまだかなり厄介です。シグナルを受信した後、fgets()は(オペレーティングシステムによっては)空の行を必要とする可能性があります。これは、read()(fgets内)がOSによって再起動されるためです。入力の解析も非常に壊れやすいです。

于 2013-01-29T19:35:43.240 に答える