江蘇百城建設(shè)有限公司官方網(wǎng)站seo站長工具查詢系統(tǒng)
? ? ? ? 在Unix/Linux控制臺(tái)編程,為了能輸出好看一些,需要知道窗口寬度,當(dāng)然使用支持很寬的窗口的終端也是個(gè)辦法,但是實(shí)在沒有很寬的終端怎么辦呢,還是要從程序上想辦法的。
? ? ? ? 判斷控制臺(tái)窗口寬度需要兩個(gè)函數(shù):
- isatty 判斷一個(gè)文件描述符是不是控制臺(tái)終端
- ioctl 參數(shù)TIOCGWINSZ用于獲取控制臺(tái)尺寸
????????isatty用法很簡單,傳入?yún)?shù)STDIN_FILENO,表示標(biāo)準(zhǔn)輸入,返回0表示非tty。一般就判斷標(biāo)準(zhǔn)輸入就行了,當(dāng)然如果考慮輸入輸出重定向,應(yīng)該判斷標(biāo)準(zhǔn)輸出才對。
????????ioctl復(fù)雜一點(diǎn),第一個(gè)參數(shù)是文件指針,第二個(gè)參數(shù)是TIOCGWINSZ,第三個(gè)參數(shù)是用來接收結(jié)果的winsize指針。
? ? ? ? winsize結(jié)構(gòu)如下:
struct winsize{unsigned short int ws_row;unsigned short int ws_col;unsigned short int ws_xpixel;unsigned short int ws_ypixel;};
? ? ? ? ws_row是行,ws_col是列。
? ? ? ? 整個(gè)代碼如下:
if (0 == isatty(STDIN_FILENO)){cout << "not tty" << endl;}else{winsize sz;if (ioctl(STDIN_FILENO, TIOCGWINSZ, (char *)&sz) < 0){cout << "get tty size error" << endl;}else{cout << "控制臺(tái)窗口尺寸 ws_row=" << sz.ws_row << " ws_col=" << sz.ws_col << endl;}}if (sizeof(long) != 8){cout << "非64位程序!" << endl;return 1;}
? ? ? ? 這是我慣用的程序啟動(dòng)流程,順手判斷了是不是64位程序,要是誰改了編譯參數(shù),不是64位我就拒絕執(zhí)行了。
? ? ? ? 以上程序是在Unix/Linux下運(yùn)行的,windows上不一定行,也沒必要,畢竟windows上的程序不會(huì)以控制臺(tái)為核心的。
(這里是結(jié)束)