kill() 에 넘겨주는 signal에 대해 간단한 질문 ..

shiefra의 이미지

간단한 shell을 짜보고 있는데요.
$kill -SIGNAL PID
를 위해 kill() 시스템콜을 사용하려다 보니까
인수로 넘겨줄 signal파라메터가 int타입이더군요.
살짝 검색해봤더니

#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    int pid;
    int sig_num;

    // 아규먼트로 pid 번호와 
    // 전송할 signal 번호를 받아들여서 
    // 이를 해당 pid 로 보낸다. 
    pid = atoi(argv[1]);
    sig_num = atoi(argv[2]);

    kill(pid, sig_num);
}

이런 예제가 보이던데.. 이건 유저가
$kill PID 9
이런 식으로 명령을 내려야만 유효할거 같은데, 맞나요?

그리고 signal이 string으로 들어오면
kill()함수에 어떻게 넘겨주나요?

써놓고 보니 한심하네요 이런것도 모르고;

익명 사용자의 이미지

void
do_kill(int argc, const char ** argv)
{
        const char *    cp;
        int             sig;
        int             pid;

        sig = SIGTERM;

        if (argv[1][0] == '-')
        {
                cp = &argv[1][1];

                if (strcmp(cp, "HUP") == 0)
                        sig = SIGHUP;
                else if (strcmp(cp, "INT") == 0)
                        sig = SIGINT;
                else if (strcmp(cp, "QUIT") == 0)
                        sig = SIGQUIT;
                else if (strcmp(cp, "KILL") == 0)
                        sig = SIGKILL;
                else if (strcmp(cp, "STOP") == 0)
                        sig = SIGSTOP;
                else if (strcmp(cp, "CONT") == 0)
                        sig = SIGCONT;
                else if (strcmp(cp, "USR1") == 0)
                        sig = SIGUSR1;
                else if (strcmp(cp, "USR2") == 0)
                        sig = SIGUSR2;
                else if (strcmp(cp, "TERM") == 0)
                        sig = SIGTERM;
                else
                {
                        sig = 0;

                        while (isDecimal(*cp))
                                sig = sig * 10 + *cp++ - '0';

                        if (*cp)
                        {
                                fprintf(stderr, "Unknown signal\n");

                                return;
                        }
                }

                argc--;
                argv++;
        }

        while (argc-- > 1)
        {
                cp = *(++argv);
                pid = 0;
                while (isDecimal(*cp))
                        pid = pid * 10 + *cp++ - '0';

                if (*cp)
                {
                        fprintf(stderr, "Non-numeric pid\n");

                        return;
                }

                if (kill(pid, sig) < 0)
                        perror(*argv);
        }
}

sash-3.7 의 do_kill 함수입니다.

도움이 되셨는지요..

saxboy의 이미지

시그널에 대한 정의는 (32개였던가요..가물가물..) /usr/include/bits/signum.h 정도에 있습니다. 위치가 정확한지는 잘 모르겠지만...

사실 실제로 사용하는 시그널은 위에 있는 do_kill()함수내에 있는 것들 정도 뿐이겠지요.