进程挂起函数pause

探讨一下pause函数的用法: 1 #include<stdio.h>
 2 #include<signal.h>
 3 #include<unistd.h>
 4 void signhand(int signo)
 5 {
 6         int i;
 7         for(i=0;i<10;i++)
 8         {
 9                 printf("signhand number is %d\n",i);
10                 sleep(1);
11         }
12 }
13 int main()
14 {
15         int i;
16         signal(SIGALRM,signhand);
17         alarm(3);
18         pause();  //进程挂起
19         for(i=0;i<10;i++)
20         {
21                 printf("main number is %d\n",i);
22                 sleep(1);
23         }
24         return 0;
25 }

程序运行结果:(其实程序是执行到pause后等待信号的触发,信号触发后,执行信号函数,执行信号函数完毕后,返回主函数继续执行!)

signhand number is 0
signhand number is 1
signhand number is 2
signhand number is 3
signhand number is 4
signhand number is 5
signhand number is 6
signhand number is 7
signhand number is 8
signhand number is 9
main number is 0
main number is 1
main number is 2
main number is 3
main number is 4
main number is 5
main number is 6
main number is 7
main number is 8
main number is 9

再看一个牛X的程序:我们设置在10s后,进程向自身发送SIGALRM信号

 1 #include<stdio.h>
 2 #include<signal.h>
 3 #include<unistd.h>
 4 void signhand(int signo)
 5 {
 6         int i;
 7         for(i=0;i<5;i++)
 8         {
 9                 printf("signhand number is %d\n",i);
10                 sleep(1);
11         }
12 }
13 int main()
14 {
15         int i;
16         signal(SIGALRM,signhand);
17         alarm(10);
18         for(i=0;i<5;i++)
19         {
20                 printf("main number is %d\n",i);
21                 sleep(1);
22         }
23         return 0;
24 }

该程序的运行结果如下:

1 main number is 0
2 main number is 1
3 main number is 2
4 main number is 3
5 main number is 4

可以看到该函数没有触发信号函数的,在主函数运行过程中根本没有信号的相关操作!

时间: 2024-11-05 12:54:27

进程挂起函数pause的相关文章

[Erlang_Question13]怎么把一个普通的进程挂入Supervisor监控树?

简单来说:应该是在调用的start_link返回一个{ok,Pid}就可以把这个进程放入监控树Supervisor里面: -module(worker). -author("[email protected]"). -export([start_link/0,stop_worker/0]). start_link() –> {ok,spawn(fun() -> loop() end)}. loop() –> case whereis(?MODULE) of undef

system()、exec()、fork()三个与进程有关的函数的比较

启动新进程(system函数) system()函数可以启动一个新的进程. int system (const char *string ) 这个函数的效果就相当于执行sh –c string. 一般来说,使用system函数远非启动其他进程的理想手段,因为它必须用一个shell来启动需要的程序.这样对shell的安装情况,以及shell的版本依赖性很大. system函数的特点: 建立独立进程,拥有独立的代码空间,内存空间 等待新的进程执行完毕,system才返回.(阻塞) 替换进程映像(ex

Linux环境编程之进程(三):函数间跳转

引言:在编写程序时,经常在函数内部使用goto语句来跳转,从而进行出错处理,那么如果想要在函数之间进行跳转该怎么做呢?使用setjmp和longjmp函数. 给出示例程序: #include <stdio.h> #include <stdlib.h> #include <setjmp.h> static void f1(int, int, int, int); static void f2(void); static jmp_buf jmpbuffer; static

nginx的worker进程挂起且某个CPU负载达到100%

nginx的worker进程挂起且某个CPU负载达到100% 场景说明: #tcp连接状态 [[email protected] ~]# netstat -nat |awk '{print   $6}'|grep -v 'Foreign'|grep -v 'established)'|sort|uniq -c|sort -rn 3010 TIME_WAIT 537 ESTABLISHED 65 SYN_RECV 45 FIN_WAIT2 20 CLOSE_WAIT 18 FIN_WAIT1 9

python网络编程--管道,信号量,Event,进程池,回调函数

1.管道 加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行任务修改,即串行修改,速度慢了,但牺牲了速度却保证了数据安全. 文件共享数据实现进程间的通信,但问题是: 1.效率低(共享数据基于文件,而文件是硬盘上的数据) 2.需要自己加锁处理 而使用multiprocess模块为我们提供的基于消息IPC通信机制:通信和管道 可以帮我们解决这两个问题. 队列和管道都是将数据存放于内存内,而队列又是基于(管道+锁)实现的,可以让我们从复杂的锁问题中解脱出来来,因而队列才是进程间通信的

双进程守护?内核对象?单实例....?抱歉会进程挂起...抱歉我还有HOOK....

那时候总会问自己,这次写的驱动,用Windbg调试过吗? 写SsdtHook,手动找过吗?写ObjectHook知道对象结构吗?用FS寄存器获取信息?为什么能获取那么多的信息?,_kpcr与他有什么关系?要从那次学习双进程守护说起,也算小半年以前的事情了.不懂互斥体.不懂事件.信号量等机制,你就说用互斥体.事件写双进程守护?科普:当年自学操作系统的时候不懂,慢慢的也就懂了.穿孔器.纸卡带的年代只有程序,为了解决人与CPU的交互效率低下,单批道处理器当年就出现了.但是仍然满足不了需求,这时候多批道

Linux进程的创建函数fork()及其fork内核实现解析

进程的创建之fork() Linux系统下,进程可以调用fork函数来创建新的进程.调用进程为父进程,被创建的进程为子进程. fork函数的接口定义如下: #include <unistd.h> pid_t fork(void); 与普通函数不同,fork函数会返回两次.一般说来,创建两个完全相同的进程并没有太多的价值.大部分情况下,父子进程会执行不同的代码分支.fork函数的返回值就成了区分父子进程的关键.fork函数向子进程返回0,并将子进程的进程ID返给父进程.当然了,如果fork失败,

[转载]DllMain中不当操作导致死锁问题的分析--进程对DllMain函数的调用规律的研究和分析

(转载于breaksoftware的csdn博客) 不知道大家是否思考过一个过程:系统试图运行我们写的程序,它是怎么知道程序起始位置的?很多同学想到,我们在编写程序时有个函数,类似Main这样的名字.是的!这就是系统给我们提供的控制程序最开始的地方(注意这儿是提供给我们的,而实际有比这个还要靠前的main).于是看到DllMain就可以想到它是干嘛的了:Dll的入口点函数.那何时调用这个函数的呢?以及各种调用场景都传给了它什么参数呢? 进程对DLL的载入卸载,以及新线程的创建和退出都会导致对Dl

CentOS6.6上进程挂起的诡异问题和处理

由于新的服务器不再支持CentOS5.4系统了,我们在新装机器上安装CentOS6.6.随着CentOS6.6机器的增多,我们逐渐注意到一个诡异问题:运行在这些机器上的某些进程,容易莫名其妙地挂起(举个例子,mysql可以连上,但命令收不到响应),也没有输出任何的错误日志,dmesg也看不到异常消息.比较容易卡住的服务有rabbitmq.mysql还有我们自己的几个Java服务程序. 一开始我们是通过重启服务来解决.然后我发现一个现象:就是如果使用gdb.strace.jstack -F命令来查