__tcsetcp() - 端末コード・ページ名の設定

標準

標準/拡張機能 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 構造体に含まれている 端末セッション・コード・ページ情報を設定 (または変更) します。

次の引数が使用されます。
fildes
コード・ページ名と CPCN 機能を取得する必要がある 端末のファイル記述子。
termcplen
渡された termcp 構造体の長さ。
termcpptr
__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 に対して 出されることがあります。

注: z/OS UNIX 端末セッションのデータ変換は、セッション (端末ファイル) を基礎にして実行されます。あるファイル記述子のデータ変換特性を変更すると、新規のデータ変換が この端末ファイルに関連したすべてのオープン・ファイル記述子に 適用されます。
重要: このサービスは注意して使用してください。データ変換の コード・ページを変更すると、セッションに使用される 実際のデータが指定されたソース (ASCII) コード・ページと ターゲット (EBCDIC) コード・ページにエンコードされない場合 には、端末セッションで想定できない動作が発生することがあります。
__termcp 構造体には、次のメンバーが含まれています。
__tccp_flags
フラグ。次のシンボルは、ビット単位の個別値として 定義されます。したがって、__tccp_flags は、次のシンボルのビット単位の包含 OR です。
シンボル
意味
_TCCP_BINARY
_TCCP_BINARY を使用して、データ変換点にデータ変換を 停止するように通知します。このフラグが設定されると、ソース・コード・ページ名とターゲット・コード・ページ名 (それぞれ __tccp_fromname と __tccp_toname) は、現行値から 変更されません。
重要: このオプションは注意して使用してください。データ変換が使用不可の 場合には、端末セッションの有効なコード・ページを使用して、データ変換が再び使用可能になるまで、z/OS UNIX シェルを使用できません。
_TCCP_FASTP
_TCCP_FASTP を使用して、ソース・コード・ページ名とターゲット・コード・ページ名によって指定されたデータ変換が、アプリケーションに対してローカルで実行できることを、データ変換点 (例えば、rlogin) に指示します。これは、テーブル主導の変換を実行できるときはいつでも有効です。例えば、データ変換点 (アプリケーション) は、z/OS UNIX iconv() サービスを使用して、内部データ変換テーブルを作成し、以降の変換で iconv() を使用する代わりに内部テーブルを使用して、すべてのデータ変換を実行できます。これによって、データ変換をさらに適切に実行できます。
__tccp_fromname
ソース・コード・ページ名。通常、これは ASCII コード・ページ名です。__tccp_fromname は、NULL (¥00) 文字を含む、最大長 _TCCP_CPNAMEMAX の NULL 終了ストリングです。

__tccp_fromname は、大文字小文字を区別します。

__tccp_toname
ターゲット・コード・ページ名。通常、これは EBCDIC コード・ページ名です。__tccp_toname は、NULL (¥00) 文字を含む、最大長 _TCCP_CPNAMEMAX の NULL 終了ストリングです。

__tccp_toname は、大文字小文字を区別します。

__tcsetcp() がバックグラウンド・プロセス・グループの プロセスからスレーブ pty に対して出されると、SIGTTOU 処理は 次のとおりになります。

SIGTTOU の処理 予期される動作
デフォルトまたはシグナル・ハンドラー SIGTTOU シグナルが生成されます。関数は実行されません。 __tcsetcp() は -1 を戻し、errno を EINTR に設定します。
無視またはブロック SIGTTOU シグナルは送信されません。関数は正常に継続します。
注: __tcsetcp() 関数は、拡張 ASCII の拡張機能のレベルに依存します。詳細は、拡張 ASCII サポートを参照してください。

戻り値

正常に実行された場合、__tcsetcp() は 0 を戻します。

正常に実行されなかった場合、__tcsetcp() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EBADF
fildes が、有効なオープン・ファイル記述子ではありません。
EINTR
シグナルが呼び出しに割り込みました。
EINVAL
termcplen の値は無効です。
EIO
関数を発行するプロセスのプロセス・グループは孤立した バックグラウンド・プロセス・グループで、関数を発行する プロセスは SIGTTOU を無視またはブロックしていません。
ENODEV
次のエラー条件のいずれかが存在しています。
  • CPCN 関数は、使用不可になっています。

    CPCN 関数をスレーブ pty に対して出す前に、__tcsetcp() 関数を マスター pty に対して出す必要があります。

  • 端末装置ドライバーは、「下方コード・ページ名のみ」CPCN 機能を サポートしません。
ENOTTY
fildes と関連したファイルは、端末装置ではありません。

次の例では、CPCN 機能とコード・ページが検索されてから、ASCII コード・ページが IBM-850 に変更されます。
#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.

関連情報