当前位置: 技术问答>linux和unix
由进程自己定时结束的问题
来源: 互联网 发布时间:2015-10-15
本文导语: 我写了一个stock通信的程序,主程序启动用 accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) 监听一个端口,有一个请求就用pthread_create(&id,&attr,(void *)funThread,(void *) &new_fd); 产生一个进程来处理,在进程中用recv函数等待从...
我写了一个stock通信的程序,主程序启动用
accept(sockfd, (struct sockaddr *)&their_addr, &sin_size))
监听一个端口,有一个请求就用pthread_create(&id,&attr,(void *)funThread,(void *) &new_fd);
产生一个进程来处理,在进程中用recv函数等待从客户端发送的信息,再处理... ...直到客户发送一个特定的字符串时再结束.
现在的问题是,如果客户端由于某种原因不能发送了,那么这个进程就将一直处于等待状态,由于recv函数是阻塞的,所以也不能做其它的检测,就想在每一个进程中定义一个定时器,刚进入时比如设定为20秒,以后每秒-1,到0时就退出进程,要是有了信息就将定时复位为20,这样的程序应该怎么做?或者有其它的解决办法吗,就是要防止进程在无限期的recv,否则一但客户端出问题,进程就会越来越多,会死机的.
谢谢大家了
accept(sockfd, (struct sockaddr *)&their_addr, &sin_size))
监听一个端口,有一个请求就用pthread_create(&id,&attr,(void *)funThread,(void *) &new_fd);
产生一个进程来处理,在进程中用recv函数等待从客户端发送的信息,再处理... ...直到客户发送一个特定的字符串时再结束.
现在的问题是,如果客户端由于某种原因不能发送了,那么这个进程就将一直处于等待状态,由于recv函数是阻塞的,所以也不能做其它的检测,就想在每一个进程中定义一个定时器,刚进入时比如设定为20秒,以后每秒-1,到0时就退出进程,要是有了信息就将定时复位为20,这样的程序应该怎么做?或者有其它的解决办法吗,就是要防止进程在无限期的recv,否则一但客户端出问题,进程就会越来越多,会死机的.
谢谢大家了
|
struct timeval timeout = {
.tv_sec = 10, //十秒钟
};
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); //设置接受超时
setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)); //设置发送超时
sockfd是 accept的返回值
如果在send或recv在阻塞了十秒之后还没有发送出或接受到数据。sent或recv就返回-1,errno==EAGAIN
|
你可以启动一个监控线程,并且维护一个线程信息数组,其中包含Timeout,线程ID信息,每个工作线程自己更新这个数据区,即出时复位数据,而监控线程则负责活动线程的Timeout的检测,可以几妙钟检测一次,如果超时则结束进程或线程,同时进程数量本身就应当做限定,到达一定数据就应当拒绝联接。