热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CYGWIN中一些问题

转自:http:blog.csdn.netcoldcranearticledetails768352最近,手头有个工作是把一个UNIX平台的项目移植到W
转自:http://blog.csdn.net/coldcrane/article/details/768352

   最近,手头有个工作是把一个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

?. 下一个问题是什么呢?
   

版权声明:本文为博主原创文章,未经博主允许不得转载。



推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文介绍如何在 Android 中通过代码模拟用户的点击和滑动操作,包括参数说明、事件生成及处理逻辑。详细解析了视图(View)对象、坐标偏移量以及不同类型的滑动方式。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
author-avatar
mobiledu2502876651
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有