2009年5月26日 星期二

Signal 訊號

Signal

原型:
void ( *signal( int sig, void (* handler)( int ))) ( int );
符號名稱信號代碼描述
SIGHUP1切斷(當通訊切斷時會送出)
SIGINT2中斷(一般為ctrl+c鍵)
SIGQUIT3中止(一般為ctrl+\鍵)
SIGILL4不合法的指令
SIGFPE8錯誤的算術操作
SIGKILL9去除
SIGSYS12提供錯誤的引數給系統呼叫
SIGRTMINSIGRTMIN+x (x=0~15)自訂

範例:
aaa.c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

int send_sig(int sig)
{
    FILE *pp=NULL;
    char stmp[256];
    int pid=0;

    if((pp=popen("ps -e | grep bbb |awk '{print $1}'", "r"))!=NULL)
    {
        if (fgets(stmp, 20, pp)!=NULL)
        {
            pid=atoi(stmp);
            if (pid > 0)
                kill(pid, SIGRTMIN+sig);
        }
    }
}

int main (void)
{
    int sig=0;
    printf("enter a signal (0~2):\n");
    scanf("%d", &sig);
    send_sig(sig);

    return;
}


bbb.c (需常駐)
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void BRI_0 ()
{
    printf("Hello World----0\n");
}

void BRI_1 ()
{
    printf("Hello World----1\n");
}

void BRI_2 ()
{
    printf("Hello World----2\n");
}

int set_signal(void)
{
    if(signal(SIGRTMIN+0, BRI_0) == SIG_ERR)
        return -1;
    if(signal(SIGRTMIN+1, BRI_1) == SIG_ERR)
        return -1;
    if(signal(SIGRTMIN+2, BRI_2) == SIG_ERR)
        return -1;

    return 0;
}

int main (void)
{
    while(1) {
    if (set_signal() < 0)
        return -1;
    }
}

在android下,
int pid= android.os.Process.myPid();
即可取得PID

沒有留言:

張貼留言