日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
decc$write_eof_to_mbx |
ファイルの終端 (EOF) メッセージをメールボックスに書き込みます。
#include <unistd.h>int decc$write_eof_to_mbx (int fd);
fd
メールボックスに関連付けられているファイル記述子。
decc$write_eof_to_mbx関数は, EOF (ファイルの終端) メッセージをメールボックスに書き込みます。パイプでないメールボックスの場合, nbytes 引数の値を 0 に設定して write関数を呼び出すと,EOF メッセージがメールボックスに送信されます。しかし,パイプの場合は,メールボックスに EOF メッセージを書き込むには,パイプをクローズするしかありません。
decc$set_child_standard_streams関数の呼び出しによって子の標準入力がパイプにリダイレクトされる場合は,親プロセスはこのパイプに対して decc$write_eof_to_mbxを呼び出すことで,子に EOF メッセージを送信することができます。子がデータを端末から読み込み,Ctrl/Z が押された場合と同じ結果になります。
decc$write_eof_to_mbxを呼び出した後,たとえば他の子との通信のために,パイプを再利用することができます。これが decc$write_eof_to_mbxの目的です。つまり,EOF メッセージを送信するためだけにパイプをクローズするのではなく,パイプを再利用することを許可します。
0 正常終了を示します。 -1 異常終了を示します。 errno と vaxc$errno は, SYS$QIOW から返された異常終了状態に従って設定されます。
/* decc$write_eof_to_mbx_example.c */ #include <errno.h> #include <stdio.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <unixio.h> #include <descrip.h> #include <ssdef.h> #include <starlet.h> int decc$write_eof_to_mbx( int ); main() { int status, nbytes, failed = 0; int fd, fd2[2]; short int channel; $DESCRIPTOR(mbxname_dsc, "TEST_MBX"); char c; /* first try a mailbox created by SYS$CREMBX */ status = sys$crembx(0, &channel, 0, 0, 0, 0, &mbxname_dsc, 0, 0); if ( status != SS$_NORMAL ) { printf("sys$crembx failed: %s\n",strerror(EVMSERR, status)); failed = 1; } if ( (fd = open(mbxname_dsc.dsc$a_pointer, O_RDWR, 0)) == -1) { perror("? open mailbox"); failed = 1; } if ( decc$write_eof_to_mbx(fd) == -1 ) { perror("? decc$write_eof_to_mbx to mailbox"); failed = 1; } if ( (nbytes = read(fd, &c, 1)) != 0 || errno != 0 ) { perror("? read mailbox"); printf("? nbytes = %d\n", nbytes); failed = 1; } if ( close(fd) == -1 ) { perror("? close mailbox"); failed = 1; } /* Now do the same thing with a pipe */ errno = 0; /* Clear errno for consistency */ if ( pipe(fd2) == -1 ) { perror("? opening pipe"); failed = 1; } if ( decc$write_eof_to_mbx(fd2[1]) == -1 ) { perror("? decc$write_eof_to_mbx to pipe"); failed = 1; } if ( (nbytes = read(fd2[0], &c, 1)) != 0 || errno != 0 ) { perror("? read pipe"); printf("? nbytes = %d\n", nbytes); failed = 1; } /* Close both file descriptors involved with the pipe */ if ( close(fd2[0]) == -1 ) { perror("close(fd2[0])"); failed = 1; } if ( close(fd2[1]) == -1 ) { perror("close(fd2[1])"); failed = 1; } if ( failed ) puts("?Example program failed"); else puts("Example ran to completion"); }
このサンプル・プログラムを実行すると,次の結果が生成されます。
Example ran to completion
目次 | 索引 |
|