解説
読み込みポインタが現在データストリームでマークを指しているかどうか見つけるために、
sockatmark() 関数は提供されています。
sockatmark() が 1 を返すなら、次の読み込みはマークの後のデータを返します。そうでなければ (帯域外データが到着したと仮定して)、次の読み込みが帯域外信号の送信の前にクライアントによって送信されたデータを提供します。このルーチンは以下に示される、割り込みまたは終了シグナルを受け取るときに、出力をフラッシュするためにリモートログインプロセスで使用されます。それは、(それを捨てるために) マークまでの正常なデータを読み込んで、次に、帯域外バイトを読み込みます。
#include <sys/socket.h>
...
oob()
{
int out = FWRITE, mark;
char waste[BUFSIZ];
/* flush local terminal output */
ioctl(1, TIOCFLUSH, (char *)&out);
for (;;) {
if ((mark = sockatmark(rem)) < 0) {
perror("sockatmark");
break;
}
if (mark)
break;
(void) read(rem, waste, sizeof (waste));
}
if (recv(rem, &mark, 1, MSG_OOB) < 0) {
perror("recv");
...
}
...
}