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);
}
|