1

私はシグナルとハンドラーの使用に非常に慣れていません。私の課題は、スケジューラ プログラムを作成することです。私が作成したいくつかの基本的なプログラムが最初に実行されると、スケジューラーに信号が送信され、スケジューラーのキューに追加されます。その後、プログラムはそれ自体を停止し、スケジューラのみがそれを開始/停止できます。シグナルをキューに入れることができると言われたので、SIGRTMIN で sigqueue を使用しています。スケジューラーは、スケジューラーのリストへの追加を要求した順序に基づいて、プログラムにタイム スライスを提供する必要があるため、これは重要です。一度に 2 つ以上の基本的なタイプのプログラムを作成する場合を除いて、私のプログラムは問題なく動作すると思います。あまりにも多くのシグナルが同時にスケジューラに送信されており、これが奇妙な問題を引き起こしていると推測しています(シグナルはキューに入れられるはずですが...

これが私のスケジューラプログラムのコードです。

//setting up sigaction
struct sigaction sigact;
sigemptyset(&sigact.sa_mask);
sigaddset(&sigact.sa_mask, SIGRTMIN);
sigact.sa_flags = SA_SIGINFO;
sigact.sa_sigaction = sigHandler;
sigaction(SIGRTMIN, &sigact, NULL);

//the actual signal handler function
void sigHandler(int sigNum, siginfo_t *info, void *unused)
{
    if (sigNum == SIGRTMIN)
    {
        pid_t nextWorker = info->si_pid;
        insert_pid(&pid_q, nextWorker);
        fprintf(stdout, "PID: %d added to queue.\n", nextWorker);
        fflush(stdout);
    }
}

何が起こっているのかを知るのを手伝ってください!:)

4

0 に答える 0