免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2528 | 回复: 9
打印 上一主题 下一主题

[POSIX] pthread_xxx 函数会被 signals 打断么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-16 22:10 |只看该作者 |倒序浏览
如题。这些函数好像不算系统调用吧,我看APUE2里也没有作这个处理。是不是这些函数不会被 signals 打断,所以不必处理?

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
2 [报告]
发表于 2007-12-16 22:15 |只看该作者
大部分pthread_xxxx不是对应一个系统调用,而是对应好几个系统调用.

例如pthread_create,首先sys_mmap2,然后sys_clone.

论坛徽章:
0
3 [报告]
发表于 2007-12-16 22:17 |只看该作者
原帖由 塑料袋 于 2007-12-16 22:15 发表
大部分pthread_xxxx不是对应一个系统调用,而是对应好几个系统调用.

例如pthread_create,首先sys_mmap2,然后sys_clone.

这个是linux pthread_create的实现吧?

论坛徽章:
0
4 [报告]
发表于 2007-12-16 22:20 |只看该作者
会,可以通过判断返回值来确定是否被signal打断了,返回值即为错误码

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
5 [报告]
发表于 2007-12-16 22:23 |只看该作者
原帖由 mmmixx 于 2007-12-16 22:17 发表

这个是linux pthread_create的实现吧?



是的,而且这只是默认情况下最简单的pthread_create.

实现中,在clone后,还调用设置进程优先级等,一系列其他系统调用,

论坛徽章:
0
6 [报告]
发表于 2007-12-16 22:27 |只看该作者
原帖由 塑料袋 于 2007-12-16 22:23 发表



是的,而且这只是默认情况下最简单的pthread_create.

实现中,在clone后,还调用设置进程优先级等,一系列其他系统调用,

这么说来,linux pthread_create 只是一个普通的函数,而不是系统调用,那么它里面会处理系统调用被 signal 打断的情况么?还是交由 pthread_create 的调用者来处理?

论坛徽章:
0
7 [报告]
发表于 2007-12-16 22:27 |只看该作者

回复 #4 cugb_cat 的帖子

刚才看了一下pthread_mutex_lock的man手册,上面说该函数不会返回EINTR错误码。

论坛徽章:
0
8 [报告]
发表于 2007-12-16 22:46 |只看该作者
原帖由 cugb_cat 于 2007-12-16 22:27 发表
刚才看了一下pthread_mutex_lock的man手册,上面说该函数不会返回EINTR错误码。

看来是不会被 signals 打断啦

论坛徽章:
0
9 [报告]
发表于 2007-12-17 12:35 |只看该作者
刚才用下面这个程序测试了一下,阻塞在mutex lock时 收到SIGUSR1  程序继续阻塞在那儿
#include <stdio.h>
#include <pthread.h>
#include <signal.h>

pthread_mutex_t test_mutex = PTHREAD_MUTEX_INITIALIZER;
void test(int signo);
int main(int argc,char *argv[])
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct sigaction sigact;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sigact.sa_handler = test;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sigemptyset(&sigact.sa_mask);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sigact.sa_flags = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sigaction(SIGUSR1, &sigact, NULL);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("1 %d\n", pthread_mutex_lock(&test_mutex));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("2 %d\n", pthread_mutex_lock(&test_mutex));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

void test(int signo)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("signal\n");
}

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
10 [报告]
发表于 2007-12-17 12:56 |只看该作者
pthread_xxx可能对应1个系统调用,也可能对应几个,还有的不对应系统调用。

但是并不是说,对应系统调用就一定可以被信号打断。

有的系统调用在核心态,根本不会睡眠
有的系统调用在核心态,以interruptible睡眠,
有的系统调用在核心态,以uninterruptible睡眠,

当pthread_xxx使用了可能以interruptible睡眠在核心态的系统调用,则可能被打断。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP