将 Win32 程序移植到 Linux
首先声明开发环境。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 |
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 |
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 |
Event |
CreateEvent |
pthread_mutex_init |
Condition |
CreateSemaphore |
pthread_cond_init |
本文转自:http://csynine.blog.51cto.com/1388509/310927