您的位置:首页 > 运维架构 > Linux

port from solaris to linux for c

2016-05-28 19:58 260 查看
在intel的linux的小端机上进行大端编译

1 sigwait() requires one more parameter in Linux.函数参数不同

dbftam_signal= sigwait(&sigset);--- solaris

retval = sigwait(&sigset,&dbftam_signal); ---linux

2 signal 变成sigaction

(void) signal( SIGALRM, ITsigalrm ); --solaris

(void)sigaction(SIGALRM, &sigcntl, (struct sigaction*)NULL);----linux

3 strlcpy()is not defined in Linux. (linux solaris 函数名不同)

#ifdef APXAPLINUX

#define strlcpy(dst, src, dstsize) strncpy(dst, src, dstsize)

#endif

4 cftime()is not defined in Linux. 函数名不同

#if !defined(APXAPLINUX)

cftime(timeBuf,"%D %T", (const time_t *) ×tamp);

#else /* defined(APXAPLINUX) */

strftime(timeBuf,sizeof(timeBuf), "%D %T", localtime((const time_t *)&DBinuse[dbid].timestamp));

#endif

5 #ifdefAPXAPLINUX 头文件不同

#include<strstream>

#else

#include<strstream.h>

#endif

6 带地址的变量 (变成 小端地址定义变量)

• msgrcvreturn only the 4th parameter matches. Need change

• unsignedlong all; /* References the whole word. */

• to

• unsignedlong all; __attribute__((littleendian));

int request __attribute__((littleendian));

scanf("%d",&request);

定义小端变量。因为c库是小端编译的。小端存(放入内存),小端读。c库是 小端编译。返回值是小端存储。

notes:

int ret_code;

ret_code = SUCCESS;



fprintf(STDERR, "ERROR: send_reorig: send message to ap fail %d\n", ret_code);



fprintf也是c库函数,但是它的入参,可以大端,可以小端。不用转

7 字节对齐

longlong in Linux

• Needto add more padding fields for Linux.

Codepattern

• typedefstruct t_size{

• long f1;

• long long f2;

• }T_SIZE;

Iccbuild results:

• Noerror or warning detected by icc

Runningresult:

• Solaris:sizeof(T_SIZE) = 16

• Linux:sizeof(T_SIZE) = 12

Solution:

• Addpadding fields

• typedefstruct t_size{

• long f1;

• #ifdefAPXAPLINUX

• Long padding;

• #endif

• long long f2;

• }T_SIZE;

8 将int变成socklen_t

#ifndef APXAPLINUX

extern int errno;-----------solaris没有 这个global变量,linux有

#endif

9 4.1.6 solaris 没有(__sighandler_t)

#ifdef APXAPLINUX

signal(UXSIG_DEBUG,(__sighandler_t)UXtog_trap_signal);

#else

signal(UXSIG_DEBUG,UXtog_trap_signal);

#endif

Notes: __sighandler_t is notaccepted by sparc build.

11 last parameter in pthread_create 参数不匹配

rc= pthread_create(&id, &attr, (OURTYPE) _UX_thread_entry, (void *) p);

12

// intitalize to hold given restrictions

tcpaddr.sin_addr.s_addr = htonl(INADDR_ANY);

tcpaddr.sin_port = htons(port);

// make bindcall

if ( (retVal= bind(m_scktNum, reinterpret_cast<struct sockaddr *>(&tcpaddr), sizeof(tcpaddr) )) < 0 ) {

ELOG((char*)"CISipSckt::bindToPort(). bind() call failed. Error: %d, %s, port: %d \n", errno, ( strerror(errno) ),port);

}

bind等网络函数是大端函数,要的就是大端的变量,所以用htonl。如果是大端,这个函数不转。如果是小端,这个函数会转.

//理解为rcvaddr是大端编译的变量

struct sockaddr_in rcvaddr;

//recvfrom是网络函数,用大端编译变量

pktLen =recvfrom(dhcpScktNum, dhcpMsgBufPtr, bytesToRead, 0, (struct sockaddr*)&rcvaddr, &rcv_addrlen);

13 : //这个和extern道理一样,告诉编译器,入参要变成小端。因为是void *p ,不能确定是类型.如果是char *p;则无所谓.

#ifdef LINUX

#pragma byte_order(push,littleendian)

#endif

void *

createClientThMain(void *arg)

#ifdef LINUX

#pragma byte_order(pop)

#endif

同理,非char*

char* convertDecimalToString(short i);

14 test 大小端的程序

union里的数据都是从同一个地址的低端开始放置,而长度大于1字节的类型需要考虑大小端(只有char不用考虑大小端)

union

{

charstr;

intdata;

};

data=0x01020304;

if(str==0x01)

{

cout<< "the meachine is big-endian"<<endl;

}

elseif(str==0x04){

cout<<"the meachine is little endia"<<endl;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: