Re: Finding out socket/pipe connectivity status

From: Jan Engelhardt
Date: Sun Aug 12 2007 - 17:33:32 EST



On Aug 12 2007 19:42, Alan Cox wrote:
>> write(stdout, request);
>> /* reference point [A] */
>> read(stdin, response);
>>
>> So my idea had been to launch another thread that monitors stdin for
>> 'breakage' and unmount the fs before a user can start an operation on
>> myfs. So I've been trying to complete the idea to code. You say a
>> broken socket raises the read flag, so:
>
>Your connection can break at any point even mid-write so you must handle
>it. You have no real choice.

Yes, of course. I was just saying that when the filesystem is in an operation,

`df` -> sys_statvfs() -> [fuse magic] -> my_fuse_fs_statfs()

I cannot cancel that operation in a way such that df (or /proc/mounts if you
like) does not show the mount anymore when the peer is dead. I have to return
something. I am fine with that.

>You can try and spot it earlier by using select/poll and checking for
>error. In which case I'd use poll() as it is a bit more clear about what
>event you get
>
>Then poll stdin and stdout. The kernel will give you back
>
>POLLERR - an error condition
>POLLHUP - a hangup
>
>if at the point you poll an error has already occurred. You can do this
>with select and the socket error and related stuff buts its uglier

poll() alone seems to do just what I want, thank you very much.

When the socket breaks, poll raises POLLIN, POLLHUP and POLLRDHUP, but not
POLLERR. What exactly is the difference between HUP and RDHUP? The manpage is
not too verbose on that. (A guess would be that RDHUP is only for sockets,
not pipes.)


thanks,
Jan
--
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/