Multithreading in gcc

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.

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

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.

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.

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

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.

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.

Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode (http://en.wikipedia.org/wiki/Unicode)? They will have you believe that Unicode requires you to use…

This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…