将 Win32 程序移植到 Linux
2013-12-29 10:44
281 查看
将 Win32 程序移植到 Linux
分类:C/C++/C#
Linux/Shell 2011-03-23 17:01 2899人阅读
评论(0)
收藏
举报
linuxwindows平台service脚本编程
对于这个问题,网上已经有很多资料给予了介绍,但是相比于这些信息,本文立足于个人的实践,将内容具体到开发环境和源代码,我觉得还是有很多值得总结和借鉴的。
首先声明开发环境。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 |
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 |
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 |
7. 线程:线程同步、等待函数、线程本地存储以及初始化和终止抽象是线程模型的重要部分。主要对应函数列表如下:
Win32 | Linux |
_beginthreadex | pthread_create |
_endthreadex | pthread_exit |
TerminateThread | pthread_cancel |
GetCurrentThreadId | pthread_self |
Win32 | Linux |
CreateMutex | pthread_mutex_init |
CloseHandle | pthread_mutex_destroy |
WaitForSingleObject | pthread_mutex_lock |
ReleaseMutex | pthread_mutex_unlock |
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 |
相关文章推荐
- 将win32程序移植到linux注意事项
- 将 Win32 程序移植到 Linux
- 将 Win32 程序移植到 Linux
- 将 Win32 程序移植到 Linux
- 将 Win32 程序移植到 Linux
- 将 Win32 程序移植到 Linux
- 将win32程序移植到linux注意事项
- 将 Win32 程序移植到 Linux
- 将Win32程序移植到Linux
- 将 Win32 程序移植到 Linux
- 将 Win32 程序移植到 Linux
- 将 Win32 程序移植到 Linux
- 将 Win32 程序移植到 Linux
- 将 Win32 程序移植到 Linux
- 将Win32程序移植到Linux上
- 将 Win32 程序移植到 Linux
- 将Win32程序移植到Linux上
- 关于Linux下alsa录音程序移植出现的奇怪问题
- 如何将Linux包含flock的程序移植到Solaris
- window程序移植到linux下(一)