オペレーティングシステムの起動3

14628 ワード

2つの同時実行の親子プロセスがあり、それぞれのプロセス番号、優先度、スケジューリングポリシーを繰り返し出力します.プロセス初期スケジューリングポリシーは、システムのデフォルトポリシーとデフォルトの優先度です.プロセスがSIGINT信号を受信すると自動的に優先度が1に加算され、SIGTSTP信号を受信すると自動的に優先度が1に減少します.以上の機能をプログラミングして実現してください

質問:


1.信号:SIGINT:ctrl+C信号SIGTST:ctrl+Z信号固定の意味.
2.signal関数:sighandler_t signal(int signum, sighandler_t handler); 第1のパラメータsignum:SIGKILLおよびSIGSTOPを除く任意の信号を取り出すことができる処理される信号タイプを示す.2番目のパラメータhandler:信号に関連付けられた動作eg:signal(SIGINT,(sighandler_t)sigcat)を記述する.ctrl+C信号を受信してsigcat関数を実行
注意:必ずスーパー権限sudoの下で実行する.outファイルでないと優先度が増加するだけで減少できない可能性があります
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
typedef void (*sighandler_t)(int);
void sigcat()
{
//+1
    setpriority(PRIO_PROCESS, getpid(),getpriority(PRIO_PROCESS, getpid()) + 1);
}
void sigzat()
{
//-1
    setpriority(PRIO_PROCESS, getpid(), getpriority(PRIO_PROCESS,getpid()) - 1);
}

int main(int argc, char *argv[])
{
    int i,j,status;
    int pid; // 
    struct sched_param p[2]; // 
    for(i=0; i<2; i++)
    {
        // 
        p[i].sched_priority = 10;
    }
    pid = fork();
    if(pid < 0)
    {
        printf("failed!");
    }
    else if(pid > 0)
    {
        signal(SIGINT, (sighandler_t)sigcat);
        sched_setscheduler(getpid(), SCHED_OTHER, &p[0]);
        setpriority(PRIO_PROCESS, getpid(), 10);
        sleep(1);
        for(i = 0; i < 10; i++)
        {
            printf("parent PID = %d, priority = %d, scheduler = %d
"
, getpid(),getpriority(PRIO_PROCESS, 0), sched_getscheduler(getpid())); printf("parent process hang on ,press Ctrl + C add 1 to priority
"
); pause(); } }else{ signal(SIGTSTP, (sighandler_t)sigzat); //signal(SIGINT, (sighandler_t)donothing); sched_setscheduler(getpid(), SCHED_OTHER, &p[1]); setpriority(PRIO_PROCESS, getpid(), 10); sleep(1); for(i=0; i<10; i++) { printf("Child PID = %d priority= %d scheduler = %d
"
,getpid(),getpriority(PRIO_PROCESS,0), sched_getscheduler(getpid())); printf("child prosecc hang on,press Ctrl + Z jie 1 to priority
"
); pause(); } exit( EXIT_SUCCESS); } return EXIT_SUCCESS; }