Multithreading in gcc

Posted on 2009-04-02
Medium Priority
Last Modified: 2012-05-06
I need to write a very small app in C that runs on linux. I need to make sure my arp tables are both current and full, so I need to write a little app that will loop through 254 addresses on a network and execute ping [ipaddress] -c 1.

While my other programming languages are strong (.net, php), I am a C noob. I am pretty sure I can figure out the for loop, passing the command line args with argv. How would you multithread this?

Using the GCC compiler on Ubuntu 8.10, but ultimately this will run on an rPath (Fedora like) server.

Thanks in advance!
Question by:DrDamnit
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
LVL 40

Expert Comment

ID: 24054324
I would use fork() instead of multi-threading. With Linux the process will be copy-on-write anyway, so it won't use much more memory than threading and is a little easier to write.

Use a parent that forks() off N children and waits for each to exit. You might fork off 10 children and let them process 25 IPs per, or you just iteratively let each child do 1 ping, then exit, which you reap by calling wait/waitpid.

Have you considered using something like nmap or fping instead? They already can do this sort of thing.
LVL 32

Author Comment

ID: 24054356
Thanks... I'll look up fork. Do you have some sample code that I can go by?

I love nmap, and we were originally going to use it for this process, but licensing prohibits us from doing what we need to do with it.
LVL 40

Accepted Solution

mrjoltcola earned 2000 total points
ID: 24054611
Warning, this blasts off 255 processes in parallel and pings each ip. The parent does not wait for children to exit, so you will have zombies, which area really not proper, but when your program is going to exit, its not going to keep it from running.

Proper form is to add a signal handler for SIG_CHLD and/or throttle the total number of processes by keeping count. Everytime your receive SIG_CHLD, call wait() then it will reap the child status.

Again, this is just a starting point for you.

You might want to get "Advanced Programming in the UNIX Environment" by W Richard Stevens, its a classic.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void ping(const char *);
int main() {
    char ip[256];
    for(int i = 1; i<=255; i++) {
        sprintf(ip, "192.168.2.%d", i);
void ping(const char * ip) {
    int pid;
    if((pid = vfork()) == 0) {
        printf("Ping %s\n", ip);
        execl("/bin/ping", "ping", "-c", "1", ip, 0);
        /* exec failed */
    else {

Open in new window

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

LVL 35

Expert Comment

by:Duncan Roe
ID: 24058415
Threads share memory and forked processes don't. In many cases therefore, threads are the only way to go. There are lots of inter-thread communication mechanisms that just aren't there for forked processes. Still, it's valid to consider whether you really need threads for what you want to do.
LVL 35

Expert Comment

by:Duncan Roe
ID: 24058487
For multiple i/o as you are doing, there is no need to use threads at all. In the microsoft languages you mentioned, you might well use threads because microsoft doesn't have a select() call that can monitor all file handles - they only have the old-fashioned kind that can monitor all sockets. Linux also has poll() as an alternative - use that or select() accroding to which you find more convenient.
No good if you're using system() though - looking more at mrjoltcola's suggested solution appeals - it's certainly a small app. If you *are* happy to fork, you could write it as a shell script - no need to use C at all. It will briefly consume 255 process slots while a thread program would only consume 1.

Expert Comment

ID: 24343730
I too agree on a shell script. It is simpler.

Featured Post

How To Reduce Deployment Times With Pre-Baked AMIs

Even if we can't include all the files in the base image, we can sometimes include some of the larger files that we would otherwise have to download, and we can also sometimes remove the most time-consuming steps. This can help a lot with reducing deployment times.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

An Outlet in Cocoa is a persistent reference to a GUI control; it connects a property (a variable) to a control.  For example, it is common to create an Outlet for the text field GUI control and change the text that appears in this field via that Ou…
The purpose of this article is to fix the unknown display problem in Linux Mint operating system. After installing the OS if you see Display monitor is not recognized then we can install "MESA" utilities to fix this problem or we can install additio…
The goal of this video is to provide viewers with basic examples to understand how to use strings and some functions related to them in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use while-loops in the C programming language.
Suggested Courses
Course of the Month11 days, 20 hours left to enroll

752 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question