大家来谈谈linux下多线程编程的“interrupted system call"错误!来者有分

liben 2003-08-14 10:14:05
大家来谈谈linux下多线程编程的“interrupted system call"错误!来者有分
...全文
1322 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liben 2003-08-15
  • 打赏
  • 举报
回复
我解决了,
只因为一点!
风格太糟,
if()后面多了个分号!
程序行太长,注意不到!


各位,程序一定要保持良好的风格!
我太惭愧了!
浪费大家的时间!!!
liben 2003-08-14
  • 打赏
  • 举报
回复
本人,刚毕业,刚找到工作!望高手们多多指教!!
liben 2003-08-14
  • 打赏
  • 举报
回复
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <pthread.h>

using namespace std;
char g_MutexBuf[100];
fd_set fdset;
struct timeval timeout;
pthread_mutex_t serverMutex = PTHREAD_MUTEX_INITIALIZER;
//unsigned int portNum ;
int fdsock;



void * manageConnect(void * paddress)
{
struct sockaddr_in server_address;
struct sockaddr_in client_address;
socklen_t cAddrLen;

sleep(7);

FD_ZERO(&fdset);
FD_CLR(fdsock, &fdset);
FD_SET(fdsock, &fdset);
cout << "this is mangeConnet" << endl;
if((select(fdsock+1, &fdset, NULL, NULL, &timeout)) < 0){
cout << "cannot select .\n"<< strerror(errno)<<endl;
fflush(stdout);
exit(0);
}


if(FD_ISSET(fdsock, &fdset)){

server_address = *(struct sockaddr_in*)paddress;
server_address.sin_port = htons(4000);
cAddrLen = sizeof(client_address);
pthread_mutex_lock(&serverMutex);
int d = recvfrom(fdsock, g_MutexBuf, 100, 0, (struct sockaddr*)&client_address, (socklen_t*)&cAddrLen);
pthread_mutex_unlock(&serverMutex);
if(d < 0){
cout <<"receive fail"<< strerror(errno)<<endl;
exit(0);
}

char *message="i already receive your data mangere\n";
int f = sendto(fdsock, message, strlen(message)+1, 0, (struct sockaddr *)&client_address, cAddrLen);
if(f < 0){
cout << "sendto fail" << strerror(errno)<<endl;
exit(0);
}
}else{pthread_exit(NULL);
}
}



int main(int argc,char ** argv)
{

struct sockaddr_in address;
int addr_len;
pthread_t connectThread;
/*char **abc;


if(argc !=2){
cout << "please input parameter"<< endl;
exit(0);
}


portNum = strtol(argv[1],abc , 10); */
if((fdsock = socket(AF_INET,SOCK_DGRAM ,0)) < 0){
cout << "socked error"<<endl;
exit(1);
}


address.sin_family = AF_INET;
address.sin_addr.s_addr = htonl(INADDR_ANY);
address.sin_port = htons(3008);
addr_len = sizeof(address);


int a = bind(fdsock, (struct sockaddr*)&address, addr_len) ;
if(a < 0){
cout << "bind error" << strerror(errno) << endl;
exit(0);
}


if(pthread_create(&connectThread, NULL, manageConnect, (struct sockaddr *)&address) );
{cout << "create pthread fail"<< endl<<strerror(errno)<<endl;
abort();
}





while(1)
{
struct sockaddr_in client_addr;
socklen_t client_len;

address.sin_port = htons(3009);
timeout.tv_sec = 1;
timeout.tv_usec = 0;

//set fdset
FD_ZERO(&fdset);
FD_CLR(fdsock, &fdset);
FD_SET(fdsock, &fdset);
cout << " main funcition"<<endl;
if((select(fdsock+1, &fdset, NULL, NULL, &timeout)) < 0){
cout << "cannot select .\n"<< strerror(errno)<<endl;
fflush(stdout);
exit(0);
}
else{}

if((FD_ISSET(fdsock, &fdset))){
client_len = sizeof(client_addr);

pthread_mutex_lock(&serverMutex);
int d = recvfrom(fdsock, g_MutexBuf, 80, 0, (struct sockaddr*)&client_addr, (socklen_t*)&client_len);
pthread_mutex_unlock(&serverMutex);
if(d < 0){
cout << "receive errno" << strerror(errno) << endl;
exit(0);
}
cout << g_MutexBuf<<endl;
char *message = "i alerad receive data";
int b = sendto(fdsock, message, strlen(message)+1, 0, (struct sockaddr*)&client_addr , client_len);
if(b < 0)
{cout << "sendto error" << strerror(errno) << endl;
exit(1);
}
close(fdsock);
} else{
sleep(5);
cout << "no data reache"<<"."<<endl;
fflush(stdout);
}
}//while

if(pthread_join(connectThread, NULL))
{cout << "join fail "<< strerror(errno)<<endl;
exit(1);
}

}
blh 2003-08-14
  • 打赏
  • 举报
回复
look your code
liben 2003-08-14
  • 打赏
  • 举报
回复
这是原因之一,但我的程序应该不是这个原因!有空看代码吗
foolfei 2003-08-14
  • 打赏
  • 举报
回复
到上限了吧,每个process最多250左右个thread
Darcy_hy 2003-08-14
  • 打赏
  • 举报
回复
我也遇到类似问题,关注!

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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