热门标签 | 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

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

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



推荐阅读
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 华为USG基于源地址的多出口策略路由配置
    网络拓扑如下:组网情况:企业用户主要有技术部(VLAN10)和行政部(VLAN20),通过汇聚交换机连接到USG。企业分别通过两个不同运营商(ISP1和ISP2)连接到 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • 本文深入探讨了计算机网络的基础概念和关键协议,帮助初学者掌握网络编程的必备知识。从网络结构到分层模型,再到传输层协议和IP地址分类,文章全面覆盖了网络编程的核心内容。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
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社区 版权所有