Platform type in Unix


 
Thread Tools Search this Thread
Top Forums Programming Platform type in Unix
# 15  
Old 06-07-2007
You're asking questions about basic UNIX stuff in a C programming thread about uname.
# 16  
Old 06-07-2007
Quote:
Originally Posted by jim mcnamara
anaias - why are you hijacking this thread?

slash_blog - the uname() call can produce the same output as the uname command.
Is there a command line utility that produces what you want on your machine?

I think on some UNIX flavors the documented command to get the platform is uname -p and not uname -m. The uname() call produces output which is more synonymous with uname -m. So while this works for Linux, for some other flavors such as Sun Solaris and HP-UX this isn't always correct.

However porter's approach is working for me so far. Though I am using
#ifdef _POWER

for IBM AIX powerpc architecture, because I couldn't find a __ppc__ or __powerpc__ defined by gcc on AIX. Is it correct to use _POWER?

thanks all for your help.
# 17  
Old 06-07-2007
i know that is why i need u guys to tell me what i should learn man i need ur advices
# 18  
Old 06-07-2007
Quote:
Originally Posted by slash_blog
for IBM AIX powerpc architecture, because I couldn't find a __ppc__ or __powerpc__ defined by gcc on AIX. Is it correct to use _POWER?
Sounds right, sometimes the macros don't have the trailing "__". As always because we don't know why you need the processor architecture we can't advise you more.

As a couple of suggestions you may be trying to find out if you are big or little endian, or perhaps 32 or 64 bit.

In the first case for macros like "_BYTE_ORDER", "_LITTLE_ENDIAN" and "_BIG_ENDIAN".

In the second case look for macros like _LP64 or __LP64__ or even "_WIN64".

This may end up long winded but worth it in the long run, I have a single file I extend as I test more architectures.

Code:
#if (!defined(_PLATFORM_BIG_ENDIAN_)) && (!defined(_PLATFORM_LITTLE_ENDIAN_))
/* 
 *      first try and determine from sys/param.h 
 */
#       include <sys/param.h>
#       if defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN) && defined(_BIG_ENDIAN)
#               if (_BIG_ENDIAN != _LITTLE_ENDIAN)
#                       if (_BYTE_ORDER==_BIG_ENDIAN)
#                               define _PLATFORM_BIG_ENDIAN_
#                       else
#                               if (_BYTE_ORDER==_LITTLE_ENDIAN)
#                                       define _PLATFORM_LITTLE_ENDIAN_
#                               endif
#                       endif
#               endif
#       endif
#endif

#if (!defined(_PLATFORM_BIG_ENDIAN_)) && (!defined(_PLATFORM_LITTLE_ENDIAN_))
/* 
 * second, try a couple of simple agnostic macros
 */
#       if defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)
#               define _PLATFORM_BIG_ENDIAN_
#       endif
#       if defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
#               define _PLATFORM_LITTLE_ENDIAN_
#       endif
#endif

#if (!defined(_PLATFORM_BIG_ENDIAN_)) && (!defined(_PLATFORM_LITTLE_ENDIAN_))
/* 
 * thirdly, look for processor specific flags and go from there
 * mips and ia64 could be either endian
 */
#       if  defined(__ppc__) || \
                ((defined(__mips__)||defined(__mips)) && ( defined(__MIPSEB__) || defined(MIPSEB) ) ) || \
                defined(__sparc__) || \
                defined(__sparc) || \
                defined(__hppa) || \
                defined(_sun3_param_h)
#               define _PLATFORM_BIG_ENDIAN_
#       else
#               if  defined(__i386__) || \
                        defined(__alpha) || \
                        defined(__x86_64__) || \
                        ( (defined(__mips__)||defined(__mips)) && ( defined(__MIPSEL__) || defined(MIPSEL) ) )
#                       define _PLATFORM_LITTLE_ENDIAN_
#               endif
#       endif
#endif

#if (!defined(_PLATFORM_BIG_ENDIAN_)) && (!defined(_PLATFORM_LITTLE_ENDIAN_))
#       error could not determine endianness, not enough clues
#endif

#if defined(_PLATFORM_BIG_ENDIAN_) && defined(_PLATFORM_LITTLE_ENDIAN_)
#       error could not determine endianness, result confusing
#endif


Last edited by porter; 06-07-2007 at 07:37 PM..
# 19  
Old 06-11-2007
Porter:

That's a lot of header work...I wonder how much of that evolved as you tested and found the original tricks didn't work on a particual machine?

For all that...a simple startup application call during runtime may have been worth it. Something like:
Code:
if ((uint16_t) 1 == htons((uint16_t) 1))
  /* BIG */
else
  /* NOT BIG (may assume LITTLE; exists a chance that we could be MIDDLE) */

Network order is defined as big endian...so if the machine stores differently than the network order then htons will switch up the bytes. This will, of course, result in its returning something other than the input value.

Easy enough if you need the data at runtime...doesn't help you much if you need it at compile time, of course.
# 20  
Old 06-11-2007
Quote:
Originally Posted by DreamWarrior
That's a lot of header work...I wonder how much of that evolved as you tested and found the original tricks didn't work on a particual machine?
True.

Quote:
Originally Posted by DreamWarrior
For all that...a simple startup application call during runtime may have been worth it.
Been there, done that, however that fails in the following two cases..

1. cross compiling for another machine, eg building on a 386 for a target of an m68k, eg building PalmOS programs.

2. building FAT binaries on MacOSX/Darwin where the target is simultaneously i386 and ppc and hence both big-endian and little-endian.

In both cases running a program tells you everything about your compilation host and nothing about your target system.

My preferred code is as follows...

Code:
short s=*(const short *)"\001\000\000\000";
if (s < 256)
{
    ... little endian ...
}
else
{
    ... big endian ...
}


Last edited by porter; 06-11-2007 at 07:51 PM..
# 21  
Old 06-12-2007
Hi Porter,

Can you please explain how this works:

short s=*(const short *)"\001\000\000\000";

Last edited by solfreak; 06-12-2007 at 04:12 AM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Red Hat

Double data type C Red Hat platform problem

I'm converting a binary file to ASCII using c code. The folllowing block of code prints correct double value 00000.000000000 on HPUNIX platform. longi double; /* C79 - Price Per Minute */ memcpy(&longi,&rbuff,8); fprintf(wfp,"%015.9f ",longi); prints : 00000.000000000 ... (6 Replies)
Discussion started by: krk
6 Replies

2. UNIX for Advanced & Expert Users

R plots in UNIX platform

How do you see plots produced in R under UNIX platform? Thanks! (2 Replies)
Discussion started by: johnkim0806
2 Replies

3. Red Hat

Machine/Hardware platform/Processor type

Hi, I am just confused about these three things which are shown in the output of uname command. I am running RH lINUX 9.0 on hardware having Intel HT CPU. My uname shows uname -p i686 (processor) uname -m i686 (machine) uname -i i386 (hardware) I was about to ... (1 Reply)
Discussion started by: dextergenious
1 Replies

4. UNIX for Dummies Questions & Answers

Is unix os or platform?

hellow everyone, iam a new user to linux and i have question about unix os. unix is operating system or platform iam confused. i have read some article about unix but i haven't found the answer what iam searching for. so iam confused in this topic can anyone made it clear. Any types of... (8 Replies)
Discussion started by: paruhang
8 Replies

5. Programming

about unix platform

Hi can any body post example for socket tcpclient in c++ act like browser with HTTp 1.1 and send message for the server (2 Replies)
Discussion started by: Net Star
2 Replies

6. UNIX for Dummies Questions & Answers

Most used unix platform as desktop.

Just wonder about this question everytime that how many of us use unix as desktop and prefers which unix platform as desktop. - nilesh (4 Replies)
Discussion started by: ynilesh
4 Replies

7. UNIX for Dummies Questions & Answers

i am newer to unix platform

i have to select particular fields from a multiple line record. my record is in dump.txt file and looks like this ******************* tipo = abonado simplex, Idiomas = dic1 - none, Operador = estandar Serv. portadora admitido: modem ind = 0 numero telefonico = 79260960, att = 0... (1 Reply)
Discussion started by: junaid.nehvi
1 Replies

8. UNIX for Dummies Questions & Answers

Need help in choosing Unix Platform.

I'm a completely noob to Unix. I have previously managed quite well Windows OS's but never Unix. -My question is quite simple: I've been investigating what's the easiest and most complex Unix OS. However, it seems there are quite a couple of OS's from which to choose, like: -Darwin ... (3 Replies)
Discussion started by: justanoob
3 Replies

9. UNIX for Advanced & Expert Users

Porting of Windows written unix scripts to unix platform

Can anybody help me in finding out a solution for the problem below? When we write .unix or .sh files in windows OS and port them to Unix platforms there is a character ^M inserted at the end of each line of the script file. During ftp porting I set the transfer mode as ASCII for the script... (7 Replies)
Discussion started by: tamilselvi
7 Replies

10. Programming

C++ on True Unix Platform

Hi all: I would like to get some details about development using C++ on TRUE Unix platform. Can anyone help me ?? Thanks, -Mandar (2 Replies)
Discussion started by: mandar3
2 Replies
Login or Register to Ask a Question