刚接触linux环境编程,关于signal()和pause()的问题,请教高手

xiaoxi_xx 2012-03-06 10:24:55
#include<signal.h>
#include<stdio.h>
#include<stdlib.h>

void my_func(int sign_no)
{
if(sign_no ==SIGINT)
printf("i have get SIGINT\n");
else if(sign_no == SIGQUIT)
printf("i have get SIGQUIT\n");
}
int main()
{
printf("waiting for signal SIGINT or SIGQUIT\n");
signal(SIGINT,my_func);
signal(SIGQUIT,my_func);
pause();
exit(0);
}
在一终端输入./a.out,执行到pause()时,然后在另一终端输入kill -s SIGINT 进程ID后,终端输出i have get SIGINT。我的困惑时:程序是顺序执行,为什么此时又回到signal(SIGINT,my_func)执行?
...全文
255 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxi_xx 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zsc_ericluo 的回复:]

此处不是进程往回执行,我想可以理解为一个条件语句,仅仅是理解:
if(接收到信号)
调用my_func函数
或许这样更好理解一点,具体实现我也不清楚!
[/Quote]
谢谢!
zsc_ericluo 2012-03-08
  • 打赏
  • 举报
回复
此处不是进程往回执行,我想可以理解为一个条件语句,仅仅是理解:
if(接收到信号)
调用my_func函数
或许这样更好理解一点,具体实现我也不清楚!
xiaoxi_xx 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wangzaiwei2006 的回复:]

引用 8 楼 xiaoxi_xx 的回复:

引用 4 楼 zsc_ericluo 的回复:

悲剧,3L没看题。。。

引用楼主 xiaoxi_xx 的回复:
为什么此时又回到signal(SIGINT,my_func)执行?


什么意思?

程序执行到pause()处被阻塞,然后信号SIGINT来时,输出i have get SIGINT(执行了my_func函数,……
[/Quote]
好的,非常感谢!
xiaoxi_xx 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zsc_ericluo 的回复:]

调试过了,程序并没有回到signal()执行:
终端一:
[root@fc test]# ./a.out &
[2] 12976
[root@fc test]# waiting for signal SIGINT or SIGQUIT

[root@fc test]#
终端二:
[root@fc test]# kill -s SIGINT 12976 //此时终端一打印……
[/Quote]
你好,请问程序没有回到signal()处执行,为什么会输出“i have get SIGQUIT”,会不会是隐式调用(不知道有没有这个名词)?
半字节 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xiaoxi_xx 的回复:]

引用 4 楼 zsc_ericluo 的回复:

悲剧,3L没看题。。。

引用楼主 xiaoxi_xx 的回复:
为什么此时又回到signal(SIGINT,my_func)执行?


什么意思?

程序执行到pause()处被阻塞,然后信号SIGINT来时,输出i have get SIGINT(执行了my_func函数,该函数由signal()调用),既此时函数从pau……
[/Quote]


看来你还是没搞清楚信号的意思。
二楼已经说了 :signal是注册信号处理函数,不是执行信号处理函数.
也就是说
你的这两行代码执行后
signal(SIGINT,my_func);
signal(SIGQUIT,my_func);
只是注册了两个处理函数,什么意思呢?就是说如果你的这个进程受到这两个信号,就转去执行,my_func这个函数。
由于执行这两行之后有个pause函数
这个pause函数会一直阻塞(你现在姑且当做无限循环理解吧),直到这个进程收到一个信号。

而你从另一个控制台输入的那个命令,实际上就是给这边这个进程发了一个信号,这边这个进程收到信号就会执行myfunc,就输出了你看到的那个。当然pause也不再阻塞。

具体的你可以看一下三楼从linux下man出来的解释。
xiaoxi_xx 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zsc_ericluo 的回复:]

悲剧,3L没看题。。。

引用楼主 xiaoxi_xx 的回复:
为什么此时又回到signal(SIGINT,my_func)执行?


什么意思?
[/Quote]
程序执行到pause()处被阻塞,然后信号SIGINT来时,输出i have get SIGINT(执行了my_func函数,该函数由signal()调用),既此时函数从pause()处又回到了signal()处,而我们知道c语言是顺序执行的,这样不是向前后矛盾?
xiaoxi_xx 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zsc_ericluo 的回复:]

signal(SIGINT,func);//当进程接收到信号时使用func函数处理;
pause()休眠等待,直到接收到信号;

建议以后使用man手册查询:
比如:
[root@fc build]# man pause
PAUSE(2) Linux Programmer’s Manual PAUSE(2)

……
[/Quote]
谢谢
xiaoxi_xx 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qq120848369 的回复:]

signal是注册信号处理函数,不是执行信号处理函数.
[/Quote]
你好,麻烦详细点,谢谢
zsc_ericluo 2012-03-07
  • 打赏
  • 举报
回复
调试过了,程序并没有回到signal()执行:
终端一:
[root@fc test]# ./a.out &
[2] 12976
[root@fc test]# waiting for signal SIGINT or SIGQUIT

[root@fc test]#
终端二:
[root@fc test]# kill -s SIGINT 12976 //此时终端一打印i have get SIGINT
[root@fc test]# kill -s SIGINT 12976
-bash: kill: (12976) - No such process//此处显示该进程已退出,就不会有你说的那种现象!

你问的应该是在为什么在终端一需要输入一个回车,才显示:
[2]+ Done ./a.out
[root@fc test]#

同求此现象的原因!
zsc_ericluo 2012-03-07
  • 打赏
  • 举报
回复
悲剧,3L没看题。。。

[Quote=引用楼主 xiaoxi_xx 的回复:]
为什么此时又回到signal(SIGINT,my_func)执行?
[/Quote]

什么意思?

zsc_ericluo 2012-03-07
  • 打赏
  • 举报
回复
signal(SIGINT,func);//当进程接收到信号时使用func函数处理;
pause()休眠等待,直到接收到信号;

建议以后使用man手册查询:
比如:
[root@fc build]# man pause
PAUSE(2) Linux Programmer’s Manual PAUSE(2)

NAME
pause - wait for signal

SYNOPSIS
#include <unistd.h>

int pause(void);

DESCRIPTION
The pause() library function causes the invoking process (or thread) to sleep until a signal is received that
either terminates it or causes it to call a signal-catching function.

RETURN VALUE
The pause() function only returns when a signal was caught and the signal-catching function returned. In this
case pause() returns -1, and errno is set to EINTR.

ERRORS
EINTR a signal was caught and the signal-catching function returned.

CONFORMING TO
SVr4, 4.3BSD, POSIX.1-2001.

SEE ALSO
kill(2), select(2), signal(2), sigsuspend(2)

Linux 1995-08-31 PAUSE(2)
qq120848369 2012-03-07
  • 打赏
  • 举报
回复
signal是注册信号处理函数,不是执行信号处理函数.
xiaoxi_xx 2012-03-07
  • 打赏
  • 举报
回复
麻烦懂的人解答下

18,828

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧