port from solaris to linux for c

12 篇文章 1 订阅

在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 *) &timestamp);

#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;

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值