- 论坛徽章:
- 0
|
各位先進好
今天我寫了一隻socket的程式,
從主線程創建一個socket初始化的副線程thread_sockClientInit
該副線程也為分離型態的thread
裡面做一些與socket server連線握手等功能
當確認握手完後又在thread_sockClientInit()裏頭做了一個分離的thread_sockKeepAlive線程
然後就自己透過pthread_exit()回收掉自己
但在top跟ps裏頭,會發現thread_sockClientInit並無如期的回收掉
猜想是否因為裡頭掛了一些全域的socket變數,所以才造成pthread_exit()以及先前嘗試的pthread_cancel(pthread_self());
都無法正常的把該thread給移除呢?
以下是程式碼片段:
- int client_sockfd;
- int len;
- struct sockaddr_in remote_addr; // SERVER STRUCT
- char buff[BUFFER_SIZE]; // SOCK BUFFER
- void clean(void* p)
- {
- printf("clean()\n");
- }
- int thread_sockClientInit()
- {
- memset(&remote_addr,0,sizeof(remote_addr)); // 數據初始化
- remote_addr.sin_family=AF_INET; // 設置為IP通訊
- remote_addr.sin_addr.s_addr=inet_addr(ServerIP);//ServerIP
- remote_addr.sin_port=htons(ServerPort); // ServerPort
- // 建立連接端socket--IPv4,TCP
- if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
- {
- perror("client socket creation failed");
- exit(EXIT_FAILURE);
- }
- // SOCKET資訊開啟
- if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)
- {
- perror("[Cloud]->>CServer connect failed");
- }
- else{
- char initalCmd[]="xxxxxxxxxinit string~~~";
- send(client_sockfd,initalCmd,strlen(initalCmd),0);
- // 接收SERVER訊息
- len=recv(client_sockfd,buff,BUFFER_SIZE,0);
- printf("[Cloud]->>>Receive from server:%s\n",buff);
- if(len<0)
- {
- perror("[Cloud]->>>Receive from server failed.<<<");
- exit(EXIT_FAILURE);
- }
- else{
- printf("[Cloud]->>>Sock init complete.<<<\n");
- sockNTP();
- sleep(1);
- printf("[Cloud]->>>Start sockKeepAlive Process.<<<\n");
- //KEEPALIVE為detached型態。
- pthread_attr_t attr;
- pthread_attr_init (&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- pthread_t pid_sockKeepAlive;
- int pret = pthread_create(&pid_sockKeepAlive,&attr, (void *) thread_sockKeepAlive, NULL);
- if(pret!=0)
- {
- printf ("Create pthread thread_sockInit error!\n");
- exit (1);
- }
- pthread_attr_destroy (&attr);
- }
- }
- //close(client_sockfd);// 關閉SOCKET
- printf ("2EXIT pthread thread_sockInit!\n");
- pthread_exit(NULL);
- }
- int main(){
- pthread_attr_t tattr;
- pthread_attr_init (&tattr);
- pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
- pthread_t pid_sockInit;
- pret = pthread_create(&pid_sockInit,&tattr, (void *) thread_sockClientInit, NULL);
- if(pret!=0)
- {
- printf ("[Main]->>>Create pthread thread_sockClientInit error!<<<\n");
- exit (1);
- }
- pthread_attr_destroy (&tattr);
- sleep(10);
- return(0);
- }
复制代码 |
|