システムインタフェース

非同期接続なしモードサービス

非同期接続なしモードのネットワーキングは、非ブロッキングサービスのエンドポイントを設定して、データ転送についての非同期通知をポーリングまたは受信することによって行われます。非同期通知を使用する場合は、実際のデータ受信はシグナルハンドラ内で行われます。

エンドポイントを非同期にする

t_open(3N) によってエンドポイントを確立して、t_bind(3N) によって識別情報を確立したら、エンドポイントを非同期サービス用に設定できます。これは、fcntl(2) 関数によってエンドポイントに O_NONBLOCK フラグを設定して行います。これ以降は、 t_sndudata(3N) を呼び出すと、バッファ空間がすぐに利用できない場合は -1 が戻され、t_errnoTFLOW に設定されます。同様に t_rcvudata(3N) を呼び出すと、データがない場合は -1 が戻され、t_errnoTNODATA に設定されます。

非同期ネットワーク転送

アプリケーションは、poll(2) 関数を使用してエンドポイントでデータの受信を定期的に調べるか、データの受信を待つことができますが、データが到着したことを知らせる非同期通知を受信する必要がある場合もあります。この場合は、ioctl(2) 関数に I_SETSIG コマンドを付けて実行し、エンドポイントにデータが到着したら SIGPOLL シグナルをプロセスに送信するように要求します。アプリケーションは、複数のメッセージによって 1 つのシグナルが生成される場合についても対処しなければなりません。

次の例で、protocol はアプリケーションが選択したトランスポートプロトコル名です。


#include <sys/types.h>
#include <tiuser.h>
#include <signal.h>
#include <stropts.h>

int				fd;
struct t_bind				*bind;
void				sigpoll(int);

	fd = t_open(protocol, O_RDWR, (struct t_info *) NULL);

	bind = (struct t_bind *) t_alloc(fd, T_BIND, T_ADDR);
	... /* バインドアドレスを設定する */
	t_bind(fd, bind, bin

	/* エンドポイントを非ブロッキングにする */
	fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);

	/* SIGPOLL のためのシグナルハンドラを確立する */
	signal(SIGPOLL, sigpoll);

	/* 受信データがあるときに SIGPOLL シグナルを要求する */
	ioctl(fd, I_SETSIG, S_INPUT | S_HIPRI);

	...

void sigpoll(int sig)
{
	int					flags;
	struct t_unitdata					ud;

	for (;;) {
		... /* ud を初期化する */
		if (t_rcvudata(fd, &ud, &flags) < 0) {
			if (t_errno == TNODATA)
				break; /* これ以上メッセージはない */
			... /* その他のエラー状態を処理する */
	}
	... /* ud 内のメッセージを処理する */
}