最近,手頭有個工作是把乙個unix平台的專案移植到windows平台,為了縮短開發周期,選擇了cygwin作為解決方案。
因為是第一次接觸cygwin, 難免就會遇到許多這樣那樣的問題。在這裡,把遇到的問題和解決的辦法羅列出來,既作為備忘,也可供參考。
環境:power edge 1800(x3.0g/512mb/73g), windows 2003, cygwin 1.5.18
1. 安裝cygwin
ed2k://|file|[cygwin].cygwin-cd-release-20051102.iso|1194323968|f43228693b5e32c2581b93f1481d0217|h=umpatfpvs4iop2it2tpopfd2karcqcml|/|sources,218.12.212.11:4662|/
找了個完整安裝包,本地安裝就是方便。
2006.05.16
2. 提供telnet,ftp服務
既然是unix的模擬環境,當然要有telnet,ftp才好用。
簡單的辦法就是安裝xinetd服務:
$cygrunsrv -i xinetd -p /usr/sbin/xinetd -d 『cygwin xinetd』 -1 /dev/null -2 /dev/null
$cygrunsrv -s xinetd
2006.05.17
4. 設定使用者
既然有了telnet和ftp,自然也的需要有使用者了。
為了使 cygwin 能夠接受登入,需要乙個 passwd 檔案。這可用以下**完成:
$ mkpasswd -l > /etc/passwd
$ mkgroup -l > /etc/group
如果在windows上對使用者做了什麼改動,也需要執行這兩個命令,這樣才能保證資訊的一致性。
注意:一般情況下,應把guest使用者從/etc/passwd中去掉。
2006.05.17
3. 測試cygwin對大檔案的支援。
有人說,早期的cygwin是不支援2gb以上的大檔案的,所以寫個程式測試一下。
眾所周知,程式要實現lfs(large file support)需要定義巨集: _file_offset_bits
#define _file_offset_bits 64
這個沒什麼好說的。
需要注意的是:
cygwin中的有關函式原型為:
int fseek(file *fp, long offset, int whence);
int fseeko(file *fp, off_t offset, int whence);
所以**中應使用 fseeko 而不是 fseek, 移植**需要注意到這一點;
2006.05.20
4. 呼叫semget出錯:"bad system call"
在cygwin下要使用ipc,還要做一些工作才行:
a. 安裝cygipc:
從cygwin安裝包取得cygpic的安裝包:cygipc-2.03-2.tar.bz2
$cp cygipc-2.03-2.tar.bz2 /
$cd /
$tar --bzip2 -xf cygipc-2.03-2.tar.bz2
$ipc-daemon2 --install-as-service
$net start ipc-daemon2
b. 安裝cygserver
$cygserver-config
$net start cygserver
c. 設定cygwin變數
$export cygwin=server
2006.05.25
5. 呼叫semget出錯:"no space left on device(errno=28)"
cygwin下,和訊號燈有關的一些預設值太小,所以會出現這樣的錯誤資訊。
要解決這個問題,自然就的修改這些預設值了:
和 cygserver 有關的選項, 儲存在 /etc/cygserver.conf, 只有在在啟動cygserver時才讀取此檔案。
預設的配置檔案安裝在/etc/defaults/etc 目錄,/usr/bin/cygserver-config 指令碼會把它拷貝到 /etc 目錄,所以可以放心的修改 /etc/cygserver.conf。
修改的內容:
# kern.ipc.semmns: maximum no. of semaphores hold concurrently.
# default: 60, min: 1, max: 1024
kern.ipc.semmns 1024
# kern.ipc.semmsl: maximum no. of semaphores per semaphore id.
# default: 60, min: 1, max: 1024
kern.ipc.semmsl 120
注釋很清楚,沒什麼好說的了。
2006.06.01
6. 如何生成 coredump 檔案?
在cygwin下,程式崩潰了,卻只生成乙個*.stackdump 檔案,裡面的東西有一些堆疊資訊,沒太大價值。
鬱悶!怎麼沒有 coredump 檔案呢?
還是看文件吧,《cygwin user』s guide》
chapter 3. using cygwin
the cygwin environment variable
error_start:win32filepath - if set, runs win32filepath when cygwin encounters a
fatal error, which is useful for debugging. win32filepath is usually set to the path
to gdb or dumper, for example c:/cygwin/bin/gdb.exe. there is no default set.
以前也看到過,就是沒引起重視,現在只有這根救命稻草了。
設定error_start為c:/cygwin/bin/dumper.exe
$ export cygwin='error_start=c:/cygwin/bin/dumper.exe'
再執行程式,哈哈,*.core 出來了。
2006.06.06
7. 裸裝置的讀寫
目前遇到的問題是需要直接向裸裝置寫入資料。
這樣看來,應該是件很簡單的事情嘛!
於是寫了段**用來向 /dev/sda2 寫入資料:
file *fp = null;
char *buf = "test";
fp=fopen( "/dev/sda2","r+" );
fwrite( buf,1,4,fp); // fwrite 返回 4
fclose(fp); // 但 fclose 返回 -1
資料沒寫進去!有點奇怪!
後來試用dd命令:
dd if=/dev/sda1 of=/dev/sda2
dd if=write.c of=/dev/sda2
這都可以寫入!
注意到乙個細節,write.c 是697 bytes,但是只寫入了512 bytes。
512不就是乙個硬碟扇區的大小嗎,問題應該就在這兒了。
在dd命令中, ibs和obs的預設值也是512, 但這個值是塊大小的概念,和碰到的問題關係不大。
個人理解:讀寫硬碟時,只能以扇區大小為基本單位。
把**改一下:
#define sector_size 512
file *fp = null;
char buf[sector_size] = "test";
fp=fopen( "/dev/sda2","r+" );
fwrite( buf,1,sector_size,fp);
fclose(fp);
ok!資料成功寫入!
有訊息說,idema已經同意將硬碟扇區大小由目前的512byte增加到4096byte, 那是不是以後我的**還得改呢?
2006.06.15
?. 下乙個問題是什麼呢?
Cygwin下配置expect遇到的問題
cygwin下定製的cron執行 expect時發現無法配對gnupg的提示輸入密碼,曾經在英文提示符下執行過一段時間是正常的,如下指令碼 spawn exec.sh expect 後來不知道何原因提示密碼變成中文提示符如下,不管如何提示符都無法正常傳送密碼,尋求解題思路 spawn exec.sh...
關於在Cygwin環境下的一些小問題
剛剛開始學習這個windows的練習unix的軟體,這個軟體個人覺得不錯。省去了裝虛擬機器或者雙系統的麻煩。我把自己最近遇到的問題和解決方案羅列在此 1.安裝好cygwin後發現沒有安裝vim或者gcc之類的軟體 第乙個解決辦法就是重新安裝cygwin,找到vim或者gcc的相關元件安裝上就可以了。...
在cygwin下安裝gcc4 0
1 首先在 2 使用winrar把gcc 4.0.0.tar.gz解壓在安裝目錄下 c temp gcc 4.0.0 比在linux下容易多了,呵呵。3 建立目標目錄 c temp build 4 配置安裝引數,通過在cygwin執行安裝目錄下的configure來配置,由於我只是測試所以太多的引數...