在cygwin下遇到的问题

原创 2006年06月01日 18:12:00


   最近,手头有个工作是把一个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. 裸设备的读写


目前遇到的问题是需要直接向裸设备写入数据。

windows是没有裸设备的概念的,但cygwin有,还是看看文档吧:
《Cygwin User's Guide》3. Using Cygwin - Special filenames - POSIX devices :
Beginning with Cygwin 1.3.4, raw devices are accessible by Cygwin processes using fixed POSIX device names.
The new fixed POSIX names are mapped to NT internal devices as follows:
...
/dev/sda /device/harddisk0/partition0 (whole disk)
/dev/sda1 /device/harddisk0/partition1 (first partition)
...

这样看来,应该是件很简单的事情嘛!

于是写了段代码用来向 /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安装完成后没有passwd文件之解决方法

如何解决Cgywin安装后没有passwd文件,无法以root用户登陆的问题

C语言初学者IDE——cygwin

开始想学C语言,找了好多IDE结果都不理想,各种原因,最后使用了cygwin编译,其实其他的也挺好用,只不过我是个菜鸟。 安装请参考http://www.programarts.com/cfree_...

从Cygwin中取出MinGW for GCC

    Cygwin内含MinGW,于是就把原有的MinGW卸载了。但是由于某种原因(原因在最后介绍)gcc在Windows命令行下就不起作用了(运行后并不产生编译结果),即使Path设置正确。   ...
  • quanben
  • quanben
  • 2008年09月25日 12:48
  • 905

Cygwin环境的熟悉和lex的使用1

熟悉cygwin环境的使用,使用lex写简单的词法分析程序,在cygwin环境下使用flex调试lex写的程序。...

cygwin下遇到system没有执行的问题

http://topic.csdn.net/u/20120329/15/f340043d-5b69-4af0-8be6-1652355e046e.htmlRT!在cygwin下做移植,从linux移植...
  • ztguang
  • ztguang
  • 2016年03月30日 10:37
  • 242

Cygwin上Eclipsef运行Hadoop遇到的有关问题

Cygwin上Eclipsef运行Hadoop遇到的有关问题 Cygwin下Eclipsef运行Hadoop遇到的问题   下午终于在Eclispe下面调通hasoop的WordCount例子...
  • pzasdq
  • pzasdq
  • 2016年02月16日 21:55
  • 181

Windows下Cygwin环境的Hadoop安装(3)- 运行hadoop中的wordcount实例遇到的问题和解决方法

转自:http://blog.csdn.net/liu_jason/article/details/7707458      谢谢原作者!   在前面的步骤中,我们已经建立了hadoop环境,下面...

cygwin下ndk arm交叉编译器编译ffmpeg遇到的问题(1)

最近在cygwin环境下用NDK交叉编译工具编译ffmpeg,在configure阶段折腾了几天,老是不成功,后发现主要原因竟然只是目录路径名称写法不对,路径名不能用/cygdrive/d来开头,而要...

windows平台使用Cygwin安装hadoop遇到的问题

经过cygwin配置ssh的磨砺(参看:http://pwcrab.blog.163.com/blog/static/16990382220107267443810/)。下面就需要在cygwin下安装...
  • k678mh
  • k678mh
  • 2013年01月09日 21:24
  • 556

总结用cygwin+eclipse+NDK编译hellojni的详细步骤,以及所遇到问题的解决方法

大部分都是转载的网友的成果,非常感谢你们做出的贡献! 软件版本: cygwin下载的最新版,教程网上大把 eclipse下载的adt-bundle-windows-x86,已包含了一个4.2的s...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在cygwin下遇到的问题
举报原因:
原因补充:

(最多只允许输入30个字)