![Solaris 10、シェルスクリプト、カーソルの移動 [閉じる]](https://linux33.com/image/29094/Solaris%2010%E3%80%81%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%80%81%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB%E3%81%AE%E7%A7%BB%E5%8B%95%20%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
#include <signal.h> #include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <time.h> void prtime() { time_t rawtime; struct tm * timeinfo; char *s; signal(SIGALRM, prtime); time ( &rawtime ); timeinfo = localtime ( &rawtime ); alarm (1) ; //printf("Time\n"); printf ( "\033[s\033[6;45H %s \033[u", asctime (timeinfo) ); } int main() { signal(SIGALRM, prtime); alarm(1); printf("continue instructions\n"); while (1) { pause(); printf("continue instructions\n"); } }
端末の特定の位置に時計を書き込もうとしていますが、時計を書く前にカーソル位置を保存し、時計を書いた後にその位置を復元したいと思います。
しかし、\033[s
&は\033[u
動作しません。
答え1
使用しているコマンドには、実装CSI s
に応じてCSI u
互換性のない解釈があります。
1つ目はカーソル位置の保存または端末エミュレータのリセットで、後者はSolaris専用のインタフェースです。
ポータブル画面処理にはncursesなどのライブラリを使用する必要がありますが、まだエスケープシーケンスをハードコードしたい場合は、期待どおりに機能できます。
printf ( "\0337\033[6;45H %s \0338", asctime (timeinfo) );