请问:down_interruptible能被信号中断是什么意思

时间:2021-08-24 15:14:48
本人刚接触内核编程,对down_interruptible能被信号中断不大理解。如果获得信号,程序可以继续运行,否则休眠。那么什么叫被信号中断呢。请各位高手解释一下,谢谢!

20 个解决方案

#1


不一定进入睡眠的,

int down_interruptible(struct semaphore *sem)
如果得不到信号量,此时没有信号打断,那么进入睡眠。
主要用来进程间的互斥同步


你如果看函数的注释,也可以知道大概的
  66/**
  67 * down_interruptible - acquire the semaphore unless interrupted
  68 * @sem: the semaphore to be acquired
  69 *
  70 * Attempts to acquire the semaphore.  If no more tasks are allowed to
  71 * acquire the semaphore, calling this function will put the task to sleep.
  72 * If the sleep is interrupted by a signal, this function will return -EINTR.
  73 * If the semaphore is successfully acquired, this function returns 0.
  74 */
  75int down_interruptible(struct semaphore *sem)

#2


我不理解被信号打断是什么意思?

#3


我的理解: 调用down_interruptible()的进程在调用down_interruptible()之后,如果sem<0,那么就进入到可中断的睡眠状态并调度其它进程运行, 但是一旦该进程收到信号,那么就会从down_interruptible函数中返回。并标记错误号为:-EINTR;

其实上面注释也很清楚了,结合自己在看看down_interruptible的源代码应该可以明白个十之八九。

GOOD LUCK!

#4


被信号打断就是说有另外的内核控制路径给这个因竞争信号量而睡眠的进程发送了信号,也就是在这个进程的进程描述符的保存signal的字段设置了值,在down_interruptible竞争信号量的循环过程中会查看自己是否收到了信号,如果收到了就立即返回,放弃继续竞争信号量,同时返回值-EINTR,表示被信号中断而返回,而正常获取信号量返回值是0.

#5


我们这样比喻吧,传入的信号量为1好比天亮,如果当前信号量为0,进程睡眠,直到(信号量为1)天亮才醒,但是可能中途有个闹铃(信号)把你闹醒。

#6


使用可被中断的版本的意思是,万一出现了semaphore的死锁,你还有机会用ctrl+c发出软中断,让等待这个内核驱动返回的用户态进程退出。而不是把整个系统都锁住了。

#7


理解

#8


我们这样比喻吧,传入的信号量为1好比天亮,如果当前信号量为0,进程睡眠,直到(信号量为1)天亮才醒,但是可能中途有个闹铃(信号)把你闹醒。  
通俗易懂!!!!!!!!!!

#9


学些了!谢谢

#10


感谢高手们。。。

#11


我们这样比喻吧,传入的信号量为1好比天亮,如果当前信号量为0,进程睡眠,直到(信号量为1)天亮才醒,但是可能中途有个闹铃(信号)把你闹醒。   
通俗易懂!!!!!!!!!!

#12


我也是读代码刚好用到这个函数上网查一下,2楼说的很对了,就是不太好理解,得多读几遍,我也是看了2楼好几遍才看懂- -!!!!

这个函数的功能就是获得信号量(semaphore应该懂吧,不懂的话就回炉重学吧),如果没得到就睡眠了,跟P操作是一样的, 但是在睡眠过程中可能被信号打断(信号懂吧?进程通信,如果不懂继续回炉~~),打断之后返回-EINTR。
挺好理解的不用想的那么麻烦就是一个 P,V操作的进程互斥或同步,只不过在睡眠过程中动点手脚

#13


本次休眠,能被中断信号终止。这个进程是可以接受中断信号的,在休眠时!

 比如你在命令行中输入 # sleep 10000 
按下ctrl + c  ,就给上面的进程发送了进程终止信号

#14


用户按下Ctrl+C,中断的到底是用户进程,还是驱动?

#15


问题问傻了。
明白了。

#16


恩,学习啦

#17


我也来举个例子:

小强下午放学回家,回家了就要开始吃饭嘛,这时就会有两种情况:

情况一:饭做好了,可以开始吃;
情况二:当他到厨房去的时候发现妈妈还在做,妈妈就对他说:“你先去睡会,待会做好了叫你。”小强就答应去睡会,不过又说了一句:“睡的这段时间要是小红来找我玩,你可以叫醒我。”

小强就是down_interruptible,想吃饭就是获取信号量,睡觉对应这里的休眠,而小红来找我玩就是中断休眠。
不知道这个例子举的咋样?

#18


理解了 但是有待实际应用

#19


引用 14 楼  的回复:
用户按下Ctrl+C,中断的到底是用户进程,还是驱动?



信号发送给用户空间,然后通过系统调用,会把这个信号传给递给驱动。而这一步你无需关心;

信号只能发送给用户空间,无权直接发送给内核的,那1G的内核空间,我们是无法直接去操作的

#20


假如你在等38路工交车,这车不来你就不坐,这个车就是型号量,但是现在突然你渴了,想去买水喝,你是不是也得走了,但是信号量(车还没来)还没得到,这个渴了就是打断你的信号!你去买了水后是不是还得来等一次车!
就是restarg!

#1


不一定进入睡眠的,

int down_interruptible(struct semaphore *sem)
如果得不到信号量,此时没有信号打断,那么进入睡眠。
主要用来进程间的互斥同步


你如果看函数的注释,也可以知道大概的
  66/**
  67 * down_interruptible - acquire the semaphore unless interrupted
  68 * @sem: the semaphore to be acquired
  69 *
  70 * Attempts to acquire the semaphore.  If no more tasks are allowed to
  71 * acquire the semaphore, calling this function will put the task to sleep.
  72 * If the sleep is interrupted by a signal, this function will return -EINTR.
  73 * If the semaphore is successfully acquired, this function returns 0.
  74 */
  75int down_interruptible(struct semaphore *sem)

#2


我不理解被信号打断是什么意思?

#3


我的理解: 调用down_interruptible()的进程在调用down_interruptible()之后,如果sem<0,那么就进入到可中断的睡眠状态并调度其它进程运行, 但是一旦该进程收到信号,那么就会从down_interruptible函数中返回。并标记错误号为:-EINTR;

其实上面注释也很清楚了,结合自己在看看down_interruptible的源代码应该可以明白个十之八九。

GOOD LUCK!

#4


被信号打断就是说有另外的内核控制路径给这个因竞争信号量而睡眠的进程发送了信号,也就是在这个进程的进程描述符的保存signal的字段设置了值,在down_interruptible竞争信号量的循环过程中会查看自己是否收到了信号,如果收到了就立即返回,放弃继续竞争信号量,同时返回值-EINTR,表示被信号中断而返回,而正常获取信号量返回值是0.

#5


我们这样比喻吧,传入的信号量为1好比天亮,如果当前信号量为0,进程睡眠,直到(信号量为1)天亮才醒,但是可能中途有个闹铃(信号)把你闹醒。

#6


使用可被中断的版本的意思是,万一出现了semaphore的死锁,你还有机会用ctrl+c发出软中断,让等待这个内核驱动返回的用户态进程退出。而不是把整个系统都锁住了。

#7


理解

#8


我们这样比喻吧,传入的信号量为1好比天亮,如果当前信号量为0,进程睡眠,直到(信号量为1)天亮才醒,但是可能中途有个闹铃(信号)把你闹醒。  
通俗易懂!!!!!!!!!!

#9


学些了!谢谢

#10


感谢高手们。。。

#11


我们这样比喻吧,传入的信号量为1好比天亮,如果当前信号量为0,进程睡眠,直到(信号量为1)天亮才醒,但是可能中途有个闹铃(信号)把你闹醒。   
通俗易懂!!!!!!!!!!

#12


我也是读代码刚好用到这个函数上网查一下,2楼说的很对了,就是不太好理解,得多读几遍,我也是看了2楼好几遍才看懂- -!!!!

这个函数的功能就是获得信号量(semaphore应该懂吧,不懂的话就回炉重学吧),如果没得到就睡眠了,跟P操作是一样的, 但是在睡眠过程中可能被信号打断(信号懂吧?进程通信,如果不懂继续回炉~~),打断之后返回-EINTR。
挺好理解的不用想的那么麻烦就是一个 P,V操作的进程互斥或同步,只不过在睡眠过程中动点手脚

#13


本次休眠,能被中断信号终止。这个进程是可以接受中断信号的,在休眠时!

 比如你在命令行中输入 # sleep 10000 
按下ctrl + c  ,就给上面的进程发送了进程终止信号

#14


用户按下Ctrl+C,中断的到底是用户进程,还是驱动?

#15


问题问傻了。
明白了。

#16


恩,学习啦

#17


我也来举个例子:

小强下午放学回家,回家了就要开始吃饭嘛,这时就会有两种情况:

情况一:饭做好了,可以开始吃;
情况二:当他到厨房去的时候发现妈妈还在做,妈妈就对他说:“你先去睡会,待会做好了叫你。”小强就答应去睡会,不过又说了一句:“睡的这段时间要是小红来找我玩,你可以叫醒我。”

小强就是down_interruptible,想吃饭就是获取信号量,睡觉对应这里的休眠,而小红来找我玩就是中断休眠。
不知道这个例子举的咋样?

#18


理解了 但是有待实际应用

#19


引用 14 楼  的回复:
用户按下Ctrl+C,中断的到底是用户进程,还是驱动?



信号发送给用户空间,然后通过系统调用,会把这个信号传给递给驱动。而这一步你无需关心;

信号只能发送给用户空间,无权直接发送给内核的,那1G的内核空间,我们是无法直接去操作的

#20


假如你在等38路工交车,这车不来你就不坐,这个车就是型号量,但是现在突然你渴了,想去买水喝,你是不是也得走了,但是信号量(车还没来)还没得到,这个渴了就是打断你的信号!你去买了水后是不是还得来等一次车!
就是restarg!

#21