对于这个问题,网上已经有很多资料给予了介绍,但是相比于这些信息,本文立足于个人的实践,将内容具体到开发环境和源代码,我觉得还是有很多值得总结和借鉴的。
首先声明开发环境。Win32程序的开发环境是VS.Net 2008,编程语言是C;Linux使用的RHEL 5.4,GCC的版本是4.1.2,编程语言也是C。
然后依次说明移植的对象:数据类型/字符串处理/系统调用/套接字/进程/进程锁/线程/线程锁/信号量/事件锁/条件锁/系统服务。
1. 数据类型:
在开发过程中,无论哪种平台,只使用最通用的数据类型char,unsigned char,int,unsigned int,void *以及它们组合的结构体类型。对于数据长度敏感的代码,则只使用下面的数据类型:
Common
|
Win32
|
Linux
|
int8
|
INT8
|
int8_t
|
uint8
|
UINT8
|
uint8_t
|
int16
|
INT16
|
int16_t
|
uint16
|
UINT16
|
uint16_t
|
int32
|
INT32
|
int32_t
|
uint32
|
UINT32
|
uint32_t
|
int64
|
INT64
|
int64_t
|
uint64
|
UINT64
|
uint64_t
|
在VS.Net 2008的项目中,使用多字节字符集,对于需要宽字符的系统调用,使用字节转换函数来处理参数。
2. 字符串处理:
虽然每个函数在两个平台下都有对应的实现,但是最好自己重新实现,因为它们都不足够令人满意:
Common
|
Win32
|
Linux
|
stricmp_x
|
_stricmp
|
strcasecmp
|
strtok_x
|
strtok_s
|
strtok_r
|
sprintf_x
|
sprintf_s
|
snprintf
|
vsprintf_x
|
vsprintf_s
|
vsnprintf
|
strcpy_x
|
strcpy_s
|
strncpy
|
strcat_x
|
strcat_s
|
strncat
|
3. 系统调用:
真正的系统调用虽然不多,只有仅有的几十个,但有些系统调用差别很大,这里就不便做一一赘述了,而有些系统调用基本没有差别,比如文件相关的操作。
4. 套接字:
套接字的几个主要函数都一样,socket/bind/listen/connect/accept/select/send/recv,几个细微的差别在于Win32使用套接字运行TCP/IP协议需要初始化上下文环境,另外,对于套接字定义,Win32使用SOCKET,Linux使用int,对于关闭套接字,Win32使用closesocket,Linux使用close。
5. 进程:
在Windows平台中使用CreateProcess来创建进程,子进程返回句柄和ID给父进程,在Linux平台中使用fork和execv来创建进程,子进程返回ID给父进程。两者最大的差别在于,在Windows平台中子进程跟父进程没有任何关系,而在Linux平台中,子进程继承了父进程的进程上下文环境。其它相关函数的差别如下:
Win32
|
Linux
|
CreateProcess
|
fork/execv
|
TerminateProcess
|
kill
|
ExitProcess
|
exit
|
GetCommandLine
|
argv
|
GetCurrentProcessId
|
getpid
|
KillTimer
|
alarm
|
SetEnvironmentVariable
|
putenv
|
GetEnvironmentVariable
|
getenv
|
GetExitCodeProcess
|
waitpid
|
6. 进程锁:
是指多个进程同步的机制。多进程同步的方法有很多,比如共享内存,命名信号量等。这里只说明一下命名信号量的机制,共享内存的方法可以查阅相关手册。Win32比较简单,在CreateMutex的参数中输入相应名称即可,Linux中,则可使用System V IPC的semget/semctl/semop操作,具体步骤直接man之。
7. 线程:
线程同步、等待函数、线程本地存储以及初始化和终止抽象是线程模型的重要部分。主要对应函数列表如下:
Win32
|
Linux
|
_beginthreadex
|
pthread_create
|
_endthreadex
|
pthread_exit
|
TerminateThread
|
pthread_cancel
|
GetCurrentThreadId
|
pthread_self
|
8. 线程锁:
对应函数列表如下。另外,特别注意的是,Win32的mutex在缺省情况下是可以递归加锁和解锁的,但是pthread的mutex在缺省情况下则不能,需要在pthread_mutex_init时设置pthread_mutexattr_t参数。
Win32
|
Linux
|
CreateMutex
|
pthread_mutex_init
|
CloseHandle
|
pthread_mutex_destroy
|
WaitForSingleObject
|
pthread_mutex_lock
|
ReleaseMutex
|
pthread_mutex_unlock
|
9. 信号量/事件锁/条件锁:
这三个同步机制功能比较相似,甚至可以相互实现。除了这三种同步机制外,各个平台上还有一些专有的同步机制。Windows平台上有信号量和事件锁,但是没有条件锁,直到Windows 2008 Server上才会有。Linux平台上有信号量和条件锁,但是没有事件锁。在一些特定场合下,没有的同步机制只能通过已有的同步机制去实现:
Common
|
Win32
|
Linux
|
Semaphore
|
CreateSemaphore
|
pthread_mutex_init
pthread_cond_init
(implement)
or sem_init
|
Event
|
CreateEvent
|
pthread_mutex_init
(implement)
|
Condition
|
CreateSemaphore
(implement)
|
pthread_cond_init
|
10. 系统服务:
在Windows中,系统服务叫service,可以通过管理工具,或者运行services.msc进入管理界面,可以安装,卸载,启动,停止和重启。在Linux中,系统服务叫daemon,一般通过命令service ??? start/stop/restart来启动,停止和重启,同样也可以安装和卸载。Windows服务可以通过SCM(Service Control Management)架构来实现,Linux服务则需要编写chkconfig相关的脚本来实现。注意,不同的Linux发行版,比如RHEL和SLES,实现脚本是不一样的。
转载声明:
本文转自
http://csynine.blog.51cto.com/1388509/310927
========================================================================
Linux下定义windows常用数据类型
对于这个问题,网上已经有很多资料给予了介绍,但是相比于这些信息,本文立足于个人的实践,将内容具体到开发环境和源代码,我觉得还是有很多值得总结和借鉴的。首先声明开发环境。Win32程序的开发环境是VS.Net 2008,编程语言是C;Linux使用的RHEL 5.4,GCC的版本是4.1.2,编程语言也是C。然后依次说明移植的对象:数据类型/字符串处理/系统调用/套接字/进程/进程锁/线程/线程锁/信号量/事件锁/条件锁/系统服务。1. 数据类型:在开发过程中,无论哪种平台,只使用最通用的数据类型char,u
概要:假设你有一些在
Windows
环境编写的代码,你想让它们在
Linux
环境下运行。代码的
移植
是一个很头疼的问题,本文介绍几个简单的方法,使你顺利将代码从
Windows
移植
到
Linux
。
1、在
Linux
实现
Win32
API之GetTickCount函数
为了将
Windows
中的GetTickCount API函数
移植
到
Linux
,可以使用如下的代码:
long GetTickCount()
tms tm;
return times(&tm);
2、
Windows
和
Linux
系统关于itoa的
移植
问题
大家知道,在将Wind
使用这两个函数,需包含头文件cstring或者string.h
strcpy()接收两个参数,如果数组比字符串小,函数将字符串中剩余的部分复制到数组后面的内存字节中,这可能会覆盖
程序
正在使用的其他内存。
strncpy()还接受第三个参数——要复制的最大字符数。
如果复制的该字符串小于最大字符数,strncpy()将在复制完该字符串之后加上空字符,以标记该字符串的结尾。
解决strcpy...
报错:cannot run compiler clang++ output的解决办法
报错:cannot find -lGL解决办法
3、jsoncpp库编译的时候各种报错,原因是里面features.h文件和系统文件重名了(参考)。
4、下载和安装
linux
deployqt
5、使用
linux
deployqt打包的时候出现问题:
提示系统使用的版本太高(...
windows
程序
移植
到
linux
的方式和会遇到的问题
怎么
移植
写一个makefile文件足矣解决这些问题,执行make在结果中去找问题,外加修改即可,所以就不过多的赘述了
移植
时可能遇到的问题
以下是我在
移植
时遇到的问题
1.sleep函数
2.getch()和getche()函数在
linux
下不兼容
3.头文件包含不同
4.乱码问题
5.对于缓冲区的控制
6.如该
程序
需要输入密码,
linux
如何控制回显和退格删除错误字符
7.gets函数的危险性
1.sleep函数
在
windows
中
下了好久的决心,终于买了一块树莓派,本着已是装机老手的心态,没有买装好系统的sd卡,自己买了一张准备自己装,结果很艰辛。
最常见的装树莓派操作系统的方式就是,
Win32
Disk Imager
再去领快递的前几个小时,我已经把前戏做的很足,镜像下载好,SD卡准备好,读卡器准备好,烧录软件准备好,准备在一小时以内点亮树莓派并搭好私有云(也就是我买树莓派的目的)
结果………………gg