【linux高級程序設計】(第十章)Linux異步信號處理機制

發送信號

在終端用kill命令殺死當前終端shell

r函數

如上, 使用 kill -SIGCONT 2563 時,終端忽略了該信號spa

         使用 kill -SIGABRT 2563 時,終端退出。須要從新輸入用戶名密碼登錄。code

 

int kill (__pid_t __pid, int __sig) :向指定進程發送信號。第一個參數爲要傳遞信號的進程號,第二個參數爲發送的信號值。blog

int raise (int __sig) :給當前進程發一個信號,即喚醒一個進程.成功返回0,不然返回-1.進程

  等價於rem

if(kill(getpid(), int __sig) == -1)
    perror("raise");

  使用raise函數get

if(raise(SIGUSR1)!= 0)
    perror("Failed to raise SIGUSR1");

 

unsigned int alarm (unsigned int __seconds) :在指定時間內產生SIGALRM信號給當前進程。此函數每調用一次,產生一個信號,並非循環產生信號的。默認接收到該信號後進程終止執行。it

#include<signal.h>
#include<stdio.h>
int main(void)
{
    printf("first time return: %d\n", alarm(4)); //4秒後生成ALARM信號
    sleep(1);
    printf("after sleep(1), remain: %d\n", alarm(2));
    printf("renew alarm, remain:%d\n", alarm(1));
}

 

__useconds_t ualarm (__useconds_t __value, __useconds_t __interval) :在第一個參數(單位:us)內產生SIGALRM信號,而後每一個指定時間(第二個參數,爲us爲單位)重複產生SIGALRM信號。執行成功,返回0.io

#include<unistd.h>
#include<signal.h>
#include<errno.h>
#include<stdio.h>
void handler()
{
    printf("int:hello\n");
}
int main()
{
    int i;
    signal(SIGALRM, handler);
    printf("%d\n", ualarm(50, 20));  //會發送屢次信號 若是是alarm只發送一次信號
    while(1)
    {
        sleep(1);
        printf("test\n");
    }
}

 

int usleep (__useconds_t __useconds):sleep函數的高精度版本

 

shell 命令 time 能夠計算某個進程運行時間。

time cat test.txt

 

real : 從執行到結束的時間

user : 進程用戶空間運行時間

sys : 進程在內核中運行時間

 

int getitimer(int which, struct itimerval * value):獲取定時器的相關信息

int setitimer(int which, const struct inimerval *value, struct itimerval *ovalue):設置定時器的相關信息

第一個參數:選擇哪一個定時器,有三個定時器可選

  • ITIMER_REAL: 以逝去時間遞減,時鐘到來後產生SIGALRM信號
  • ITIMER_VIRTUAL: 當進程執行自身代碼時遞減,時鐘超時產生SIGVTALRM信號
  • ITIMER_PROF: 當進程自身執行或者是系統在執行進程的系統調用時遞減,時鐘超時產生SIGPROF信號。可聯合ITIMER_VIRTUAL計算進程在用戶空間和系統空間的運行時間。

第二個參數類型聲明以下:

struct itimerval{
    struct timeval it_interval;  //間隔值
    struct timeval it_value; //當前剩餘值
};
struct timeval{
    long tv_sec;  //s爲單位
    long tv_usec; //ms爲單位
};

例子:

#include<stdio.h>
#include<stdlib.h>
#include<sys/time.h>
#include<signal.h>

int main(void)
{
    struct itimerval setvalue;
    setvalue.it_interval.tv_sec = 3;
    setvalue.it_interval.tv_usec = 0;
    setvalue.it_value.tv_sec = 3;
    setvalue.it_value.tv_usec = 0;
    setitimer(ITIMER_REAL, &setvalue, NULL);
    
    setitimer(ITIMER_VIRTUAL, &setvalue, NULL);
    
    setvalue.it_value.tv_sec = 1;
    setitimer(ITIMER_PROF, &setvalue, NULL);
    
    while(1)
    {
        struct itimerval value;
        getitimer(ITIMER_REAL, &value);
        printf("ITIMER_REAL: internal:%ds%dms, remain:%ds%dms\n",
            value.it_interval.tv_sec, value.it_interval.tv_usec,
            value.it_value.tv_sec, value.it_value.tv_usec);
        getitimer(ITIMER_VIRTUAL, &value);
        printf("ITIMER_VIRTUAL: internal:%ds%dms, remain:%ds%dms\n",
            value.it_interval.tv_sec, value.it_interval.tv_usec,
            value.it_value.tv_sec, value.it_value.tv_usec);
        getitimer(ITIMER_PROF, &value);
        printf("ITIMER_PROF: internal:%ds%dms, remain:%ds%dms\n",
            value.it_interval.tv_sec, value.it_interval.tv_usec,
            value.it_value.tv_sec, value.it_value.tv_usec);
        
        sleep(1);
    }
}

??爲何第二次和第三次的ITIMER_VIRTUAL的剩餘值有4187ms??比間隔值還大?

??爲何我設定的值是3s0ms可是會顯示3s187ms??

相關文章
相關標籤/搜索