当我尝试调度单个线程来轮询unix套接字时,我注意到一些奇怪的行为。 当我在osx 10.6.8上测试代码时,代码崩溃,我看到运行代码的多个线程。 奇怪的是,在osx 10.7.5上,当它崩溃时,我只看到它在一个线程上运行。
在我的AppDelegate中,我发送了这样的线程(一次):
[pp performSelectorInBackground:@selector(runloop) withObject:nil];
pp是My IPC类的一个实例。
在我的IPC类中,runloop是一些C代码的包装器
@implementation IPC
-(void) runloop
{
ipc_busy = 0;
unixsocket_runloop();
}
runloop意味着等待单个连接(每个运行时) 然后处理程序等待数据包,直到程序终止。 C代码看起来像这样 -
/**
* Waits for a connection and dispatches the socket handler
* No need to fork since we will only ever have a single connection per program launch
*/
int unixsocket_runloop()
{
int connection_fd;
socklen_t address_length;
while((connection_fd = accept(socket_fd,
(struct sockaddr *) &address,
&address_length)) > -1)
{
return unixsocket_handler(connection_fd);
}
return 0; // for posterity
}
这是连接处理程序 -
/**
* Handles the connection from the client
* loops infinitely and reads from the socket when there is a message
* Stores message into a ring buffer of buffers
*/
int unixsocket_handler(int connection_fd)
{
size_t nbytes;
char readbuffer[USBUFSIZE];
bzero(readbuffer,USBUFSIZE);
while((nbytes = read(connection_fd, readbuffer, USBUFSIZE)))
{
// store in buffer
bufPut(readbuffer,nbytes);
bzero(readbuffer,USBUFSIZE);
}
close(connection_fd);
return 0;
}
在我的堆栈跟踪中,我看到这个unixsocket_runloop发生在2个线程中。 虽然我不相信这是崩溃的根本原因, 这是我想要解决的意外行为。
我通过自己的套接字类滚动的唯一原因是b / c我在开源社区中看到的很多选项都是硬连接到TCP。特别是吸引人的cocoaAsyncSocket类。