#include <signal.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> void sigintTest(int sign_no) { printf("\nI have get SIGINT\n"); } void sigQuitTest(int sign_no) { printf("\nI have get SIGQUIT\n"); exit(0); } int main() { printf("Waiting for signal SIGINT \n "); signal(SIGINT, sigintTest); signal(SIGQUIT,sigQuitTest); pause(); while(1) { printf("I am running.\n"); sleep(1); } printf("bye.\n"); exit(0); }
时间: 2023-11-20 08:55:13 浏览: 165
这是一个使用信号处理程序的 C 语言程序。程序中定义了两个信号处理函数:`sigintTest()` 和 `sigQuitTest()`,分别处理 `SIGINT` 和 `SIGQUIT` 信号。在 `main()` 函数中,先输出一条等待信号的提示信息,然后使用 `signal()` 函数分别将 `SIGINT` 和 `SIGQUIT` 信号的处理函数注册到信号处理表中。接着调用 `pause()` 函数使程序挂起等待信号的到来,一旦收到信号,就会调用相应的信号处理函数。在程序中,如果收到 `SIGINT` 信号,会输出一条提示信息;如果收到 `SIGQUIT` 信号,会输出另一条提示信息,然后使用 `exit()` 函数退出程序。如果没有收到信号,程序会进入一个死循环,不断输出一条提示信息,直到收到信号后退出程序。
相关问题
#include<pthread.h> #include<stdlib.h> #include <stdio.h> #include <sys/types.h> #include<signal.h> #include <unistd.h> void func () ; int main (void *arg) { int i,j; signal (17,func); int iPID=fork () ; if(iPID>0){ printf("PID:%d,Parent: Signal 17 will_be send to Child! " , getpid()) ; kill(iPID,17) ; printf ( "PID:%d, Parent: finished! " , getpid() ); } else { printf ( "PID:%d " , getpid()); sleep (1); printf ("PID:%d, Child: finished ! " , getpid()); exit (0); } return 0; } void func ( ) { printf("PID:%d,It is signal 17 processing function! " , getpid() ) ; }
这是一个用 C 语言写的进程间通信程序,使用了 fork 函数创建子进程,并在父进程中向子进程发送信号。
程序中先定义了一个 signal 函数的回调函数 func,用于接收信号 17,并在接收到信号后打印一条信息。
在 main 函数中,首先使用 signal 函数注册信号 17 的处理函数为 func。然后使用 fork 函数创建一个子进程。如果 iPID>0,则表示当前进程是父进程,它会打印出自己的进程 ID(PID),然后向子进程发送信号 17。接着父进程会打印出自己的进程 ID 并结束。
如果 iPID=0,则表示当前进程是子进程,它会打印出自己的进程 ID,然后等待 1 秒钟,最后打印出自己的进程 ID 并结束。
需要注意的是,进程间通信的方式有很多种,这里使用信号是其中的一种。在程序中使用了 signal 函数注册信号处理函数,同时使用了 kill 函数向子进程发送信号。在实际场景中,还可以使用共享内存、消息队列、信号量等方式进行进程间通信。
用signal函数改写下面的程序,使闹钟时间到后输出“ling ling ling”,然后接着执行pause()后的语句。 提示:定时器时间到后向进程发出SIGALRM信号。 #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { /* 调用alarm定时器函数 */ int ret = alarm(5); pause(); printf("I have been waken up.\n"); return 0; }
下面是使用signal函数改写后的程序:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void alarm_handler(int sig) {
printf("ling ling ling\n");
}
int main() {
// 注册SIGALRM信号处理函数
signal(SIGALRM, alarm_handler);
// 设置定时器
alarm(5);
// 暂停进程,等待信号到来
pause();
printf("I have been waken up.\n");
return 0;
}
```
程序中使用了signal函数注册了SIGALRM信号的处理函数alarm_handler,当定时器时间到达时,操作系统会向进程发送SIGALRM信号,进程就会执行alarm_handler函数来处理该信号。在alarm_handler函数中输出"ling ling ling",然后程序继续执行pause()后的语句。
阅读全文