open.itworld.com
  Search  
Security Home Page Security Webcasts Security White Papers Security Newsletters Security News Open Topics Careers ITworld Voices ITwhirled The Security site of ITworld.com
All About main()
LINUX TIPS AND TRICKS --- 08/09/2002

Danny Kalev

Due to historical reasons, platform-dependent quirks, and under-specification in pre-standard C, we are left with several valid prototypes of main(). 

On this topic

Canonical Form
The canonical prototype of main() is as follows:

int main()

The return value is the exit code of the process. Although it's of type int, only the eight lowest bits of this value are significant. Put differently, the valid range of values that main() may return is -128 through 127. A return value of 0 indicates success; any other value indicates an error of some sort. All negative exit statuses are reserved for processes that are terminated by other processes or by the kernel (e.g., due to a signal). A positive value indicates a user-defined error code.

In pre-standard C, a function with no explicit return value would return int implicitly. This deprecated convention is still supported, though it's best avoided. Programs that declare main() as follows are accepted by most compilers:

main()

Note that such programs do return an implicit exit status because the kernel stores each process's exist status in a special table.

Command Line Arguments
main() has a second canonical form that enables you to access command line arguments:

int main(int argc, char * argv[])

The argc argument is the total number of arguments passed. It shall not be negative. argv is an array of pointers to the argument strings The first argument, argv[0], contains the executable's name. Whether it's the full pathname or not is implementation-dependent. argv[argc-1] is the last argument and argv[argc] is NULL. Remember: if your program doesn't access command line arguments, you should use the prototype:

int main()

This form is safer and slightly more efficient than

int main(int argc, char * argv[])

Passing an Environment
The standard recommends that additional parameters to main() be declared after the canonical argc and argv. A common form of main() that takes a third argument is:

int main(int argc, char * argv[], char *envp[])

The execle() and execve() functions enable you to pass a specific environment to the newly launched process. envp contains the process's environment in the form of an array of strings. Note that you can always access the process's environment by accessing the global variable environ, which is defined in <unsitd.h>. However, if you pass a special environment to a process, using the third parameter envp makes your intent more explicit and saves you the trouble of locating the definition of environ.

 

Danny Kalev is a system analyst and software engineer with more than 10 years of experience, specializing in C++ and object-oriented analysis and design on various platforms including VMS, DOS, Windows, Unix, and Linux. His technical interests involve code optimization, networking, and distributed computing. He is also a member of the ANSI C++ standardization committee and the author of ANSI/ISO C++ Professional Programmer's Handbook (Que, 1999). Danny can be reached at Danny.Kalev@itworld.com.



Advertisements
Sponsored links
Bring harmony to your mix of UNIX-Linux-Windows computing environments
KODAK i1400 Series Scanners stand up to the challenge
Top 5 Reasons to Combine App Performance and Security
Locate Hidden Software on business PCs with this free tool
 Home   Newsletters  LINUX TIPS AND TRICKS
www.itworld.com    open.itworld.com     security.itworld.com     smallbusiness.itworld.com
storage.itworld.com     utilitycomputing.itworld.com     wireless.itworld.com

 
Contact Us   About Us   Privacy Policy    Terms of Service   Reprints  

CIO   Computerworld   CSO   GamePro   Games.net   IDG Connect   IDG World Expo   Infoworld   ITworld   JavaWorld   LinuxWorld  MacUser   Macworld   Network World   PC World   Playlist  

Copyright © Computerworld, Inc. All rights reserved

Reproduction in whole or in part in any form or medium without express written permission of Computerworld Inc. is prohibited. Computerworld and Computerworld.com and the respective logos are trademarks of International Data Group Inc.