標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
z/OS® UNIX | 両方 |
#define _OPEN_SYS_PTY_EXTENSIONS
#include <termios.h>
int __tcsetcp(int fildes, size_t termcplen, const struct __termcp *termcpptr);
__tcsetcp() 関数は、termcp 構造体に含まれている 端末セッション・コード・ページ情報を設定 (または変更) します。
端末セッション用のデータ変換環境を変更するために、__tcsetcp() 関数を使用して、データ変換点へ新規の コード・ページ情報を送信します。この関数は、「下方コード・ページ名のみ」の コード・ページ変更通知 (CPCN) 機能をサポートする端末装置と一緒に使用されます。z/OS UNIX pseudotty (pty) 装置ドライバーは、この機能をサポートします。
z/OS UNIX pty 装置ドライバーを使用する端末セッションの 場合には、データ変換点はマスター pty 装置を使用する アプリケーションです。例のデータ変換点は、z/OS UNIX rlogin サーバーです。ここで、rlogin は CPCN 関数を使用して、端末データの変換に 使用する ASCII ソースまたは EBCDIC ターゲット・コード・ページ またはその両方を判別します。__tcsetcp() 関数の処理時に、pty 装置ドライバーは、pty アウトバウンド・データ・キューを 使い果たしたときに __termcp 構造体を適用します。これが起こると、pty 入力データ・キューもフラッシュされ、拡張パケット形態が使用可能になる (PKTXTND は termios 構造体に設定される) と、TIOCXPKT_CHCP パケット例外イベントが生成され、マスター pty を使用して、コード・ページ情報が変更されたことをアプリケーションに通知します。その後で、マスター pty アプリケーションは __tcgetcp() 関数を使用して、新規のコード・ページ情報を検索し、新規のデータ変換環境を確立できます。
__tcsetcp() 関数はマスターとスレーブ pty 装置ドライバーの 両方によってサポートされますが、CPCN 関数は、最初に マスター pty を使用するアプリケーションで使用できるように しておく必要があります。マスター pty 装置に対する 初期 __tcsetcp() 呼び出し時に、システムが CPCN 関数を 使用できるようにします。いったん __tcsetcp() 関数がマスター pty に 対して実行されると、続いてその関数はスレーブ pty に対して 出されることがあります。
__tccp_fromname は、大文字小文字を区別します。
__tccp_toname は、大文字小文字を区別します。
__tcsetcp() がバックグラウンド・プロセス・グループの プロセスからスレーブ pty に対して出されると、SIGTTOU 処理は 次のとおりになります。
SIGTTOU の処理 | 予期される動作 |
---|---|
デフォルトまたはシグナル・ハンドラー | SIGTTOU シグナルが生成されます。関数は実行されません。 __tcsetcp() は -1 を戻し、errno を EINTR に設定します。 |
無視またはブロック | SIGTTOU シグナルは送信されません。関数は正常に継続します。 |
正常に実行された場合、__tcsetcp() は 0 を戻します。
CPCN 関数をスレーブ pty に対して出す前に、__tcsetcp() 関数を マスター pty に対して出す必要があります。
#define _OPEN_SYS_PTY_EXTENSIONS
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
void main(void)
{
struct __termcp mytermcp;
int rv;
int cterm_fd;
if ((cterm_fd = open("/dev/tty",O_RDWR)) == -1)
printf("No controlling terminal established.¥n");
else {
if ((rv = __tcgetcp(STDIN_FILENO,sizeof(mytermcp),&mytermcp))== -1)
perror("__tcgetcp() error");
else {
if (rv== _CPCN_NAMES) {
if (_TCCP_BINARY == (mytermcp.__tccp_flags & _TCCP_BINARY))
printf("Binary mode is in effect. No change made.¥n");
else {
strcpy(mytermcp.__tccp_fromname,"IBM-850");
if (__tcsetcp(STDOUT_FILENO,sizeof(mytermcp),&mytermcp)!=0)
perror("__tcsetcp() error");
else
printf("ASCII code page changed to IBM-850.¥n");
} /*not binary mode */
} /* _CPCN_NAMES */
} /* __tcgetcp success */
close(cterm_fd);
} /* controlling terminal established */
} /* main */
ASCII code page changed to IBM-850.