在cygwin下遇到的問題

2021-04-07 08:44:02 字數 4041 閱讀 9433

最近,手頭有個工作是把乙個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來配置,由於我只是測試所以太多的引數...