当前位置: 技术问答>linux和unix
本人写了一个线程池的程序,现在遇到一个问题
来源: 互联网 发布时间:2015-08-05
本文导语: 这个星期,写了线程池实现socket服务器端的程序,在redhat环境下测试都能通过,移植到Aix unix的时候,正常通讯都是没有问题的。只是在按Ctrl+C的时候,却产生了core。 所以就有了疑问,在unix下的多线程程序,是否是...
这个星期,写了线程池实现socket服务器端的程序,在redhat环境下测试都能通过,移植到Aix unix的时候,正常通讯都是没有问题的。只是在按Ctrl+C的时候,却产生了core。
所以就有了疑问,在unix下的多线程程序,是否是随机由一个线程接收Ctrl+C产生的中断信号?我该怎么屏蔽掉子线程的信号接收?
产生core一般来说,肯定是程序本身的问题,但是我找不到错在哪里,下面是一个简单的程序模拟,也产生了core,请大家看看。
#include
#include
#include
#include
#include
#include
#include
#include
#include
pthread_mutex_t mutex;
pthread_cond_t cond;
pthread_t tid, tid2, tid3;
void *thread_start(void *arg)
{
while(1)
{
pthread_mutex_lock(&mutex);
if( pthread_cond_wait(&cond,&mutex) == EINTR )
{
printf("eintr...............n");
}
pthread_mutex_unlock(&mutex);
}
pthread_exit(0);
}
void killHandle(int signo)
{
printf("get here.n");
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
exit(-2);
}
int createthread(void)
{
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond, NULL);
pthread_create(&tid, NULL, thread_start, NULL);
pthread_create(&tid2, NULL, thread_start, NULL);
pthread_create(&tid3, NULL, thread_start, NULL);
}
int main(void)
{
int sockfd = -1;
int ret = 0;
int listenfd = 0;
struct sockaddr_in server_addr;
signal(SIGTERM, killHandle);
signal(SIGINT, killHandle);
signal(SIGPIPE, killHandle);
createthread();
sockfd = socket(AF_INET, SOCK_STREAM, 0 );
if( sockfd == -1 )
{
printf("getSocket:socket create error.n");
return -1;
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(50001);
server_addr.sin_addr.s_addr = INADDR_ANY; /* 自动获取本机地址 */
bzero(&(server_addr.sin_zero), 8);
ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
if( ret == -1 )
{
printf("getSocket:socket bind error.n");
return -1;
}
listenfd = listen(sockfd, 120);
for( ;; )
{
printf("main:get here 1n");
ret = select(sockfd+1, NULL, NULL, NULL, NULL);
if( ret == EINTR )
{
printf("main: eintrn");
return 0;
}
printf("main:get here 2n");
}
return 0;
}
所以就有了疑问,在unix下的多线程程序,是否是随机由一个线程接收Ctrl+C产生的中断信号?我该怎么屏蔽掉子线程的信号接收?
产生core一般来说,肯定是程序本身的问题,但是我找不到错在哪里,下面是一个简单的程序模拟,也产生了core,请大家看看。
#include
#include
#include
#include
#include
#include
#include
#include
#include
pthread_mutex_t mutex;
pthread_cond_t cond;
pthread_t tid, tid2, tid3;
void *thread_start(void *arg)
{
while(1)
{
pthread_mutex_lock(&mutex);
if( pthread_cond_wait(&cond,&mutex) == EINTR )
{
printf("eintr...............n");
}
pthread_mutex_unlock(&mutex);
}
pthread_exit(0);
}
void killHandle(int signo)
{
printf("get here.n");
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
exit(-2);
}
int createthread(void)
{
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond, NULL);
pthread_create(&tid, NULL, thread_start, NULL);
pthread_create(&tid2, NULL, thread_start, NULL);
pthread_create(&tid3, NULL, thread_start, NULL);
}
int main(void)
{
int sockfd = -1;
int ret = 0;
int listenfd = 0;
struct sockaddr_in server_addr;
signal(SIGTERM, killHandle);
signal(SIGINT, killHandle);
signal(SIGPIPE, killHandle);
createthread();
sockfd = socket(AF_INET, SOCK_STREAM, 0 );
if( sockfd == -1 )
{
printf("getSocket:socket create error.n");
return -1;
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(50001);
server_addr.sin_addr.s_addr = INADDR_ANY; /* 自动获取本机地址 */
bzero(&(server_addr.sin_zero), 8);
ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
if( ret == -1 )
{
printf("getSocket:socket bind error.n");
return -1;
}
listenfd = listen(sockfd, 120);
for( ;; )
{
printf("main:get here 1n");
ret = select(sockfd+1, NULL, NULL, NULL, NULL);
if( ret == EINTR )
{
printf("main: eintrn");
return 0;
}
printf("main:get here 2n");
}
return 0;
}
|
查查Ctrl+C在AIX UNIX下产生的信号是什么?然后用signal或sigaction函数来屏蔽它.