Chinaunix

标题: [POSIX] pthread_xxx 函数会被 signals 打断么? [打印本页]

作者: mmmixx    时间: 2007-12-16 22:10
标题: [POSIX] pthread_xxx 函数会被 signals 打断么?
如题。这些函数好像不算系统调用吧,我看APUE2里也没有作这个处理。是不是这些函数不会被 signals 打断,所以不必处理?
作者: 塑料袋    时间: 2007-12-16 22:15
大部分pthread_xxxx不是对应一个系统调用,而是对应好几个系统调用.

例如pthread_create,首先sys_mmap2,然后sys_clone.
作者: mmmixx    时间: 2007-12-16 22:17
原帖由 塑料袋 于 2007-12-16 22:15 发表
大部分pthread_xxxx不是对应一个系统调用,而是对应好几个系统调用.

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

这个是linux pthread_create的实现吧?
作者: cugb_cat    时间: 2007-12-16 22:20
会,可以通过判断返回值来确定是否被signal打断了,返回值即为错误码
作者: 塑料袋    时间: 2007-12-16 22:23
原帖由 mmmixx 于 2007-12-16 22:17 发表

这个是linux pthread_create的实现吧?



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

实现中,在clone后,还调用设置进程优先级等,一系列其他系统调用,
作者: mmmixx    时间: 2007-12-16 22:27
原帖由 塑料袋 于 2007-12-16 22:23 发表



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

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

这么说来,linux pthread_create 只是一个普通的函数,而不是系统调用,那么它里面会处理系统调用被 signal 打断的情况么?还是交由 pthread_create 的调用者来处理?
作者: cugb_cat    时间: 2007-12-16 22:27
标题: 回复 #4 cugb_cat 的帖子
刚才看了一下pthread_mutex_lock的man手册,上面说该函数不会返回EINTR错误码。
作者: mmmixx    时间: 2007-12-16 22:46
原帖由 cugb_cat 于 2007-12-16 22:27 发表
刚才看了一下pthread_mutex_lock的man手册,上面说该函数不会返回EINTR错误码。

看来是不会被 signals 打断啦
作者: cugb_cat    时间: 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");
}

作者: 塑料袋    时间: 2007-12-17 12:56
pthread_xxx可能对应1个系统调用,也可能对应几个,还有的不对应系统调用。

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

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

当pthread_xxx使用了可能以interruptible睡眠在核心态的系统调用,则可能被打断。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2