在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;
}