我从一个帖子得到以下代码:
int next_stuff(char **code){
...
len=read(file_desc,buffer+end_len,packet_size-end_len);
if(len<=0)
{
if(len==-1 && errno==EAGAIN) return(0);
else return(-1);
}
...
}
while (next_stuff(&buff) == 0)
{
...
}
在另一个线程上,我想完成该套接字并退出此操作,但只执行
close(file_desc);
不会导致读取返回非阻塞。我错过了什么吗?
编辑:
关机也不起作用。我正在Linux 2.6.23上尝试
答案 0 :(得分:2)
shutdown(fd,SHUT_RD);
$ man -s 2 shutdown
NAME shutdown - 关闭部分全双工连接
概要
#include <sys/socket.h>
int shutdown(int socket, int how);
说明
The shutdown() call causes all or part of a full-duplex connection on the socket
associated with socket to be shut down.
If how is SHUT_RD, further receives will be disallowed. If how is
SHUT_WR, further sends will be
disallowed. If how is SHUT_RDWR, further sends and receives will be disallowed.
返回值
The shutdown() function returns the value 0 if successful; otherwise the value -1 is
returned and the global variable errno is set to indicate the error.
答案 1 :(得分:1)
通常,如果您不想阻止套接字调用,则可以使用select()来查看套接字是否已准备好进行读取,写入或处于错误状态。此外,将超时值传递给select(),以便此调用不会永久阻塞。在select()调用返回后,您可以查看应用程序是否要退出,如果是,则执行“正确”操作(由您决定)。
答案 2 :(得分:0)
如果你的read()调用是非阻塞的,它应该返回相当快,因为它将要做的就是插入内存。 为了防止造成任何损害,你可以在你的调用中使用一个互斥量来读取()和关闭(),这样它们就不能同时运行。
如果您的套接字阻塞,我认为您应该将其设置为非阻塞。
答案 3 :(得分:0)
关于非阻塞套接字的其他答案都很好,我建议重新编码以使用该方法。
作为对你的问题的直接回答,尝试调用shutdown()并查看是否会破坏其他线程的读取。我担心close()只是递减使用次数,而shutdown()会主动拆掉套接字。
答案 4 :(得分:0)
我认为你没有提供足够的信息来回答这个问题。例如,如果您打开的套接字是UDP,则发送方的关闭对接收方没有影响。如果它是TCP,则会破坏其他内容。我建议如果您真的处理套接字,请使用recv
或recvfrom
代替read
。
对于TCP,您的读取将返回0个字节,表示另一方已关闭连接。
如果你真的是在两个线程而不是两个进程之间进行此操作,那么管道可能更合适。这并不是说管道也不能在两个独立的进程之间使用,在这种情况下只需要设置一些。