多线程异常
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <math.h>
- #include <string.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #include <sys/wait.h>
- #include <unistd.h>
- #define PI 3.1415926
- #define TIMER0 0
- #define PORT 5000 // The port which is communicate with server
- #define BACKLOG 10
- void nettran1(void* nsockfd);
- int main (void)
- {
- int sockfd,nsockfd;
- int opt;
- struct sockaddr_in addr_local;
- pthread_t threadid1;
- pthread_attr_t attr;
- struct sockaddr_in addr_remote; // New Socket file descriptor
- int sin_size; // to store struct size
- sin_size = sizeof (struct sockaddr_in);
- if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
- {
- printf ("ERROR: Cannot obtain Socket Despcritorn");
- exit(1);
- }
- else
- {
- printf ("OK: Obtain Socket Despcritor sucessfullyn");
- }
- /* Fill the local socket address struct */
- addr_local.sin_family = AF_INET; // Protocol Family
- addr_local.sin_port = htons (PORT); // Port number
- addr_local.sin_addr.s_addr = INADDR_ANY; // AutoFill local address
- bzero (&(addr_local.sin_zero), 8); // Flush the rest of struct
- opt = SO_REUSEADDR;
- setsockopt (sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt));
- /* Blind a special Port */
- if (bind(sockfd, (struct sockaddr *) &addr_local, sizeof (struct sockaddr)) == -1)
- {
- printf ("ERROR: Cannot bind Port %dn", PORT);
- exit(1);
- }
- else
- {
- printf ("OK: Bind the Port %d sucessfullyn", PORT);
- }
- /* Listen remote connect/calling */
- if (listen (sockfd, BACKLOG) == -1)
- {
- printf ("ERROR: Cannot listen Port %dn", PORT);
- exit(1);
- }
- else
- {
- printf ("OK: Listening the Port %d sucessfullyn", PORT);
- }
- while(1)
- {
- perror("Is there any error?") ;
- /* Wait a connection, and obtain a new socket file despriptor for single connection */
- if ((nsockfd = accept (sockfd, (struct sockaddr *) &addr_remote,&sin_size)) != -1)
- {
- printf ("OK: Server has got connect from %s %dn", inet_ntoa (addr_remote.sin_addr),nsockfd);
- pthread_attr_init(&attr);
- pthread_attr_setstacksize(&attr,100);
- perror("Is there any error1?") ;
- if(pthread_create(&threadid1,&attr,(void*)(nettran1),(void*)nsockfd)!=0)
- {
- perror("Error to create thread") ;
- close (nsockfd);
- continue;
- }
- /* pthread_detach(threadid1,NULL); */
- pthread_join(threadid1,NULL);
- }
- }
- //close (nsockfd);
- }
- void nettran1(void* nsockfd)
- {
- double value;
- char sdbuf[8];
- int num,i=0,sig=4;
- while(1)
- {
- perror("send0:");
- if(i++>90) i = 0;
- value = sin (i * PI/ 45);
- perror("send1:");
- gcvt (value, sig, sdbuf);
- perror("send:");
- printf("value=%s %dn",sdbuf,(int)nsockfd);
- // SendMessage((HWND)hwnd,MSG_MYMESSAGE,0,0);
- if ((num = send ((int)nsockfd,&sdbuf, sizeof (sdbuf),0)) ==-1)
- {
- perror("send:");
- close ((int)nsockfd) ;
- pthread_exit(NULL);
- }
- }
- }
复制代码
代码如上,多线程函数运行后,perror检测到异常:Interrupted system call。send发动不成功。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
第四次!
这个程序问题必较多:
1. 无法接收多个客户端,因为创建的线程是joinable的,pthread_join()会阻塞,无法accept()更多的客户端。
2. 注意线程的stacksize是否足够。
3. send失败是因为有信号唤醒了了send的阻塞。不清楚是刚刚运行就有问题,还是过一段时间才有问题。建议采用下面的方法处理:
a). 检查errno的编号
复制代码
b) 或者用pthread_sigmask屏蔽不必要的信号.
总体上感觉代码应该还有很多问题,需要仔细检查。
CU的回复总是失败,也不能在编辑!
3. send失败是因为有信号唤醒了了send的阻塞。不清楚是刚刚运行就
这个程序问题必较多:
1. 无法接收多个客户端,因为创建的线程是joinable的,pthread_join()会阻塞,无法accept()更多的客户端。
2. 注意线程的stacksize是否足够。
3. send失败是因为有信号唤醒了了send的阻塞。不清楚
这个程序问题必较多:
1. 无法接收多个客户端,因为创建的线程是joinable的,pthread_join()会阻塞,无法accept()更多的客户端。
2. 注意线程的stacksize是否足够。
3. send失败是因为有信号唤醒了了send的阻塞。不