https://www.sharcnet.ca/help/index.php/Signal_Handling_and_Checkpointing
Handling signal is a important job when we want to write a great code.
There are several signal functions that we could use often in programming. I will give some examples of how to use alarm() and sigaction() functions as below.
P.S: the URL link is the orginal source code which is from.
The follwing two examples are about how to use alarm() and ualarm().
http://jyhshin.pixnet.net/blog/post/27749178-linux-%E8%A8%88%E6%99%82%E5%99%A8-alarm-signal-%281%29
| 
/* Example of using alarm() */
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
int main(int argc, char *argv[]) {
    sigset_t block;
    sigemptyset(&block);
    sigaddset(&block, SIGALRM);
    sigprocmask(SIG_BLOCK, &block, NULL);
    while (1) {
        alarm(2);
        printf("%d\n", time(NULL));
        sigwaitinfo(&block, NULL);
    }
    return 0;
} | 
| 
/* Example of using ualarm() */
#define _XOPEN_SOURCE 500
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
int main(int argc, char *argv[]) {
    sigset_t block; sigemptyset(&block);
    sigaddset(&block, SIGALRM);
    sigprocmask(SIG_BLOCK, &block, NULL);
    ualarm(500000, 500000);
    while (1) {
        printf("%d\n", time(NULL));
        sigwaitinfo(&block, NULL);
    } return 0;
}
 | 
Actually, sigaction() is widely used in handling signal, for instance, SIGINT (interrupt), SIGCHLD, and so on. Here are the examples to show the usage of sigaction with SIGINT.
http://www.linuxprogrammingblog.com/code-examples/sigaction
| 
/* Example of using sigaction() to setup a signal handler with 3 arguments
 * including siginfo_t.
 */
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
static void hdl (int sig, siginfo_t *siginfo, void *context)
{
    printf ("Sending PID: %ld, UID: %ld\n",
            (long)siginfo->si_pid, (long)siginfo->si_uid);
}
int main (int argc, char *argv[])
{
    struct sigaction act;
    memset (&act, '\0', sizeof(act));
    /* Use the sa_sigaction field because the handles has two additional parameters */
    act.sa_sigaction = &hdl;
    /* The SA_SIGINFO flag tells sigaction() to use the sa_sigaction field, not sa_handler. */
    act.sa_flags = SA_SIGINFO;
    if (sigaction(SIGINT, &act, NULL) < 0) {
        perror ("sigaction error");
        return 1;
    }
    while (1)
        sleep (10);
    return 0;
}  | 
http://fanqiang.chinaunix.net/a4/b2/20010508/113528_b.html
| 
/* Example of using sigaction() to setup a signal handler
 * with setting sa_handler
 */
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
#define PROMPT "Do you want to terminate the process?"
char *prompt=PROMPT;
void ctrl_c_oper(int signo)
{
    write(STDERR_FILENO,prompt,strlen(prompt));
}
int  main()
{
    struct sigaction act;
    act.sa_handler=ctrl_c_oper;
    sigemptyset(&act.sa_mask);
    act.sa_flags=0;
    if(sigaction(SIGINT,&act,NULL)<0)
    {
        fprintf(stderr,"Install Signal Action Error:%s\n\a",strerror(errno));
        exit(1);
    }
    while(1);
}  | 
 
 
No comments:
Post a Comment