久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久


信號發送函數kill()和raise()

分享到:
           

    本文關鍵字: 信號發送函數,kill(),raise()

    kill()函數(shu)同(tong)讀者熟知的(de)kill系統(tong)命(ming)令(ling)一樣,可以(yi)發(fa)送信號(hao)給進(jin)程(cheng)(cheng)或進(jin)程(cheng)(cheng)組(實(shi)際上,kill系統(tong)命(ming)令(ling)只是(shi)kill()函數(shu)的(de)一個(ge)用戶接口)。這里(li)需要注意的(de)是(shi),它不僅(jin)可以(yi)中(zhong)止進(jin)程(cheng)(cheng)(實(shi)際上發(fa)出SIGKILL信號(hao)),也可以(yi)向進(jin)程(cheng)(cheng)發(fa)送其他信號(hao)。

    ;與kill()函(han)數不同的是,raise()函(han)數允許進程向自身發送信號。

    表(biao)1列出了kill()函(han)數的(de)語法(fa)要點。

表(biao)1 kill()函數語(yu)法要點(dian)

所需頭文件 #include <signal.h>
#include <sys/types.h>
函數原型 int kill(pid_t pid, int sig)
函數傳入值 pid 正數:要發送信號的進程號
0:信號被發送到所有和當前進程在同一個進程組的進程
1:信號發給所有的進程表中的進程(除了進程號大的進程外)
<-1:信號發送給進程組號為-pid的每一個進程
sig:信號
函數返回值 成功:0
出錯:-1

  ; &nbsp;表2列出(chu)了raise()函數的語法要(yao)點。

表(biao)2 raise()函(han)數語法(fa)要點

所需頭文件 #include <signal.h>
#include <sys/types.h>
函數原型 int raise(int sig)
函數傳入值 sig:信號
函數返回值 成功:0
出錯:-1

    下面的示例首先使用fork()創(chuang)建(jian)了一個(ge)子(zi)(zi)進(jin)(jin)程(cheng)(cheng)(cheng),接著為了保證子(zi)(zi)進(jin)(jin)程(cheng)(cheng)(cheng)不在(zai)父進(jin)(jin)程(cheng)(cheng)(cheng)調用kill()之前退出,在(zai)子(zi)(zi)進(jin)(jin)程(cheng)(cheng)(cheng)中(zhong)(zhong)使(shi)用raise()函數向(xiang)自身發(fa)送SIGSTOP信(xin)號,使(shi)子(zi)(zi)進(jin)(jin)程(cheng)(cheng)(cheng)暫停。接下來(lai)在(zai)父進(jin)(jin)程(cheng)(cheng)(cheng)中(zhong)(zhong)調用kill()向(xiang)子(zi)(zi)進(jin)(jin)程(cheng)(cheng)(cheng)發(fa)送信(xin)號,在(zai)該(gai)示例(li)中(zhong)(zhong)使(shi)用的是SIGKILL,讀者(zhe)可以使(shi)用其他(ta)信(xin)號進(jin)(jin)行練(lian)習。

    /* kill_raise.c */
    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <sys/types.h>
    #include <sys/wait.h>

    int main()
    {
        pid_t pid;
        int ret;

        /* 創建一個子進程 */
        if ((pid = fork()) < 0)
        {
            printf("Fork error\n");
            exit(1);
        }

        if (pid == 0)
        {
            /* 在子進程中使用raise()函數發出SIGSTOP信號,使子進程暫停 */
            printf("Child(pid : %d) is waiting for any signal\n", getpid());
            raise(SIGSTOP);
            exit(0);
        }
        else
        {
            /* 在父進程中收集子進程發出的信號,并調用kill()函數進行相應的操作 */
            if ((waitpid(pid, NULL, WNOHANG)) == 0)
            {
                if ((ret = kill(pid, SIGKILL)) == 0)
                {
                    printf("Parent kill %d\n",pid);
                }
            }

            waitpid(pid, NULL, 0);
            exit(0);
        }
    }

    該(gai)程序運行結果如(ru)下:

    $ ./kill_raise
    Child(pid : 4877) is waiting for any signal
    Parent kill 4877 

    本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》

   熱(re)點鏈接:

   1、Linux下的信號機制
   2、有名管道(FIFO)
   3、標準流管道
   4、無名管道系統調用
   5、Linux下進程間通信方式-管道

更多新聞>>