Linux gperf C and C++ command line processing programming tutorial

Posted on in Categories C Programming, Linux, UNIX last updated July 29, 2007

GNU ‘gperf’ generates perfect hash functions. If a long option shows an argument as mandatory, then it is mandatory for the equivalent short option also. Use this tutorial for effective command-line processing in your C/C++ code:

Command-line processing is historically one of the most ignored areas in software development. Just about any relatively complicated software has dozens of available command-line options. In fact, it’s not uncommon to find hundreds of lines of if-else statements coded to process user input, and maintenance of such legacy code becomes a time-consuming affair even for seasoned programmers. In such circumstances, most C developers commonly go for a rather long (and often nested) if-else statement with ANSI C library functions such as strcmp, strcasecmp, and strtok …

The gperf utility is tuned to quickly generate a perfect hash for small to medium datasets. But gperf has other applications, as well. In fact, it’s the tool of choice of maintaining perfect hashes for language keywords in GNU compilers, and recent advances allow you to work with larger datasets. So, consider making gperf part of your next development project.

GNU perfect (gperf) hash function generator makes short work of complex input strings

Optimizing Linux code, application and programs – system performance

Posted on in Categories C Programming, GNU/Open source, High performance computing, Howto, Linux, Tuning last updated June 11, 2007

Wringing the value out of every processor cycle on your machine required a variety of approaches. Sure, your code has to be efficient, but you also have to have your disks configured correctly, and a multitude of other things. Swayam Prakash provides a guide to some of the lower hanging fruit you can pick.

From the article:

Performance optimization in Linux doesn’t always mean what we might think. It’s not just a matter of outright speed; sometimes it’s about tuning the system so that it fits into a small memory footprint. You’d be hard-pressed to find a programmer that does not want to make programs run faster, regardless of the platform. Linux programmers are no exception; some take an almost fanatical approach to the job of optimizing their code for performance. As hardware becomes faster, cheaper, and more plentiful, some argue that performance optimization is less critical–particularly people that try to enforce deadlines on software development.

Note this this article is all about application optimization and not about server level optimization.

Optimizing Linux System Performance

Howto: Connect MySQL server using C program API under Linux or UNIX

Posted on in Categories C Programming, FreeBSD, Gentoo Linux, Howto, Linux, MySQL, OpenBSD, RedHat/Fedora Linux, Solaris, Suse Linux, Tips, Ubuntu Linux, UNIX last updated May 31, 2007

From my mailbag:

How do I write a C program to connect MySQL database server?

MySQL database does support C program API just like PHP or perl.

The C API code is distributed with MySQL. It is included in the mysqlclient library and allows C programs to access a database.

Many of the clients in the MySQL source distribution are written in C. If you are looking for examples that demonstrate how to use the C API, take a look at these clients. You can find these in the clients directory in the MySQL source distribution.

Requirements

Make sure you have development environment installed such as gcc, mysql development package etc. Following is the list summarize the list of packages to compile program:

  • mysql: MySQL client programs and shared library
  • mysqlclient: Backlevel MySQL shared libraries (old libs)
  • mysql-devel: Files for development of MySQL applications (a must have)
  • mysql-server: Mysql server itself
  • gcc, make and other development libs: GNU C compiler

Sample C Program

Following instructions should work on any Linux distro or UNIX computer. Here is the small program that connects to mysql server and list tables from mysql database.(download link):

/* Simple C program that connects to MySQL Database server*/
#include <mysql.h>
#include <stdio.h>

main() {
   MYSQL *conn;
   MYSQL_RES *res;
   MYSQL_ROW row;

   char *server = "localhost";
   char *user = "root";
   char *password = "PASSWORD"; /* set me first */
   char *database = "mysql";

   conn = mysql_init(NULL);

   /* Connect to database */
   if (!mysql_real_connect(conn, server,
         user, password, database, 0, NULL, 0)) {
      fprintf(stderr, "%s\n", mysql_error(conn));
      exit(1);
   }

   /* send SQL query */
   if (mysql_query(conn, "show tables")) {
      fprintf(stderr, "%s\n", mysql_error(conn));
      exit(1);
   }

   res = mysql_use_result(conn);

   /* output table name */
   printf("MySQL Tables in mysql database:\n");
   while ((row = mysql_fetch_row(res)) != NULL)
      printf("%s \n", row[0]);

   /* close connection */
   mysql_free_result(res);
   mysql_close(conn);
}

How do I compile and link program against MySQL libs?

MySQL comes with a special script called mysql_config. It provides you with useful information for compiling your MySQL client and connecting it to MySQL database server. You need to use following two options.
Pass –libs option – Libraries and options required to link with the MySQL client library.

$ mysql_config --libs
Output:

-L/usr/lib64/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -L/usr/lib64 -lssl -lcrypto

Pass –cflags option – Compiler flags to find include files and critical compiler flags and defines used when compiling the libmysqlclient library.
$ mysql_config --cflags
Output:

-I/usr/include/mysql -g -pipe -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing

You need to pass above option to GNU C compiler i.e. gcc. So to compile above program, enter:
$ gcc -o output-file $(mysql_config --cflags) mysql-c-api.c $(mysql_config --libs)
Now execute program:
$ ./output-file
Output:

MySQL Tables in mysql database:
columns_priv
db
func
help_category
help_keyword
help_relation
help_topic
host
tables_priv
time_zone
time_zone_leap_second
time_zone_name
time_zone_transition
time_zone_transition_type
user 

References:

  • MySQL C API – A must read – official MySQL C API documentation

Understanding and using GNU GCC Compiler Parameters

Posted on in Categories C Programming, FreeBSD, Gentoo Linux, GNU/Open source, Linux, Open source coding, OpenBSD, RedHat/Fedora Linux, Suse Linux, UNIX, Windows last updated April 7, 2007

The GNU Compiler Collection (GCC) includes C, C++, Fortran and other programming languages. GCC was originally written by Richard Stallman in 1985. GCC is the only compiler you can find under wild verity of operating systems / hardware architectures (CPU).

gcc gives us many useful options to make our code into whatever we like. By understanding what these options really do, we can make the program faster and slimmer.

gcc (GNU C Compiler) is actually a collection of frontend tools that does compilation, assembly, and linking. The goal is to produce a ready-to-run executable in a format acceptable to the OS. For Linux, this is ELF (Executable and Linking Format) on x86 (32-bit and 64-bit). But do you know what some of the gcc parameters can do for you? If you’re looking for ways to optimize the resulted binary, prepare for a debugging session, or simply observe the steps gcc takes to turn your source code into an executable, getting familiar with these parameters is a must. So, please read on.

Understanding and using interrupt management under Linux

Posted on in Categories C Programming, GNU/Open source, Howto, Linux, Linux Embedded devices, Open source coding last updated April 6, 2007

This article describes the most important concepts related to the Linux kernel’s interrupt handling mechanisms.

A clear understanding of the Linux kernel’s interrupt handling mechanism is essential if you are to write solid, reusable device interrupt handlers. It is also mandatory if you are to successfully port Linux to custom hardware.

Bill Gatliff provides a walkthrough of the portions of the Linux kernel that manage interrupts and describes how Linux interacts with interrupt controllers and how to adapt code for custom hardware.

Interrupt handling is a fundamental part of the Linux kernel. Most of the kernel’s functionality, in particular the parts of interest to embedded developers, in some way involve interrupt handling.

=> Interrupt Management Under Linux – Using the Interrupt Controller API

Unix Programming faqs, howto resources on Web and books

Posted on in Categories Beyond nixCraft, C Programming, Howto, Linux, UNIX last updated March 8, 2007

=> FAQ collection from comp.unix.programmer (mirror 2)

=> The Art Of Unix Programming book by ESR

=> More links and resources – Davin’s collection of unix programming links

Books

=> Advanced UNIX Programming by Warren W Gay. Sams White Book – Provides the fundamentals of UNIX programming and easy to follow book for all new programmers/students.

=> Advanced Programming in the UNIX(R) Environment (2nd Edition) – The best book if you wanna be a UNIX guru. I am currently reading this book for my computer science UNIX programming class.

Download advanced Linux programming book PDF version

Posted on in Categories C Programming, Download of the day, GNU/Open source, Howto, Links, Open source coding last updated February 20, 2007

If you are a developer for the GNU/Linux system, this book will help you to write and/or develop GNU/Linux software that works the way users expect it to.

Advanced Linux Programming is published under the Open Publication License, Version 1, no options exercised. (Due to an oversight in final production, the copyright notice on the book is incorrect.) The full text may be downloaded from this site. Code samples in the book are covered by the GNU General Public License and are also available.

Topics

Chapter 01 – Advanced Unix Programming with Linux
Chapter 02 – Writing Good GNU/Linux Software
Chapter 03 – Processes
Chapter 04 – Threads
Chapter 05 – Interprocess Communication
Chapter 06 – Mastering Linux
Chapter 07 – The /proc File System
Chapter 08 – Linux System Calls
Chapter 09 – Inline Assembly Code
Chapter 10 – Security
Chapter 11 – A Sample GNU/Linux Application

Download link

=> Advanced Linux programming book, by Mark Mitchell, Jeffrey Oldham, Alex Samuel (via Digg)

How to debug make: tips for debugging makefiles

Posted on in Categories Beyond nixCraft, C Programming, Linux, Open source coding, UNIX last updated October 25, 2006

The purpose of the make utility is to determine automatically which pieces of a large program need to be recompiled, and issue the commands to recompile them.

To prepare to use make, you must write a file called the makefile that describes the relationships among files in your program, and the states the commands for updating each file.

Sometime makefiles become so large, you need to debug them.

This article helps you to get make to work for you, not against you i.e. debugging make and its makefiles.

From the article:
Make and utilities like it are fundamental tools for streamlining the application build process. Learn the structure of the makefile, how to avoid common mistakes in its creation, and how to solve or work around portability issues and other problems as they crop up.

Most UNIX and Linux programs are built by running make. The make utility reads a file (generally named either “makefile” or “Makefile,” but hereafter merely referred to as “a makefile”) that contains instructions and performs various actions to build a program. In many build processes, the makefile is itself generated entirely by other software; for instance, the autoconf/automake programs are used to develop build routines. Other programs may ask you to directly edit a makefile, and of course, new development may require you to write one.

Read more at IBM developerworks [ibm.com]

How a Web server actually works ~ with C source code

Posted on in Categories Beyond nixCraft, C Programming, Howto, News, UNIX last updated September 25, 2006

Do you wonder how to write a program that accepts incoming messages with a network socket? Have you ever just wanted your own Web server to experiment and learn with?

Have you ever wondered how a Web server actually works? Experiment with nweb — a simple Web server with only 200 lines of C source code. In this article, Nigel Griffiths provides a copy of this Web server and includes the source code as well. You can see exactly what it can and can’t do.

Well, look no further — nweb is what you need. This is a simple Web server that has only 200 lines of C source code. It runs as a regular user and can’t run any server-side scripts or programs, so it can’t open up any special privileges or security holes.

This article covers:

  • What the nweb server program offers
  • Summary of C functions features in the program
  • Pseudo code to aid understanding of the flow of the code
  • Network socket system calls used and other system calls
  • How the client side operates
  • C source code

nweb only transmits the following types of files to the browser :

  • Static Web pages with extensions .html or .htm
  • Graphical images such as .gif, .png, .jgp, or .jpeg
  • Compressed binary files and archives such as .zip, .gz, and .tar
  • If your favorite static file type is not in this list, you can simply add it in the source code and recompile to allow it.

Read more at IBM developerworks