Rss

pcount: a simple but fast Linux process counter

While there is many different ways to do it, having a dedicated tool to count how many processes an executable file are currently running was one of my need. And because I wanted a really performant way of doing it, I wrote this tiny tool named pcount.

Here is the full C source code, no specific license attached, the code is really too trivial to claim for anything ^^:

/* pcount.c - A (simple but fast) process counter
 * returns the number of Linux process matching the given executable filename
 * 20121126 - dlb < dlb at atdan dot net >
 * The goal here is pure performance, no other checks than the bare necessary
 * are made, feel free to do a bloated version if you want ^^
 *
 * compile: gcc -Wall -o pcount pcount.c
 */
#include <dirent.h>
#include <stdio.h>
#include <string.h>	// for strcmp()
#include <unistd.h>	// for chdir() and readlink()

#define PROC_DIR "/proc"

int main (int argc, char *argv[]) {
	DIR *dir;		// our dir handler
	struct dirent *entry;	// current directory entry
	char lnk_path[256];	// symlink pathname
	char tgt_path[256];	// target pathname
	int len, pcount = 0;	// guess what...

	/* get the executable pathname to check for as an argument */
	if (argc < 2) {
		fprintf (stderr, "usage: %s \n", argv[0]);
		return (1);
	}

	/* go into the PROC_DIR directory */
	if (chdir(PROC_DIR) != 0) {
		perror ("Can't change directory to "PROC_DIR);
		return (2);
	}

	/* open the PROC_DIR directory */
	dir = opendir (PROC_DIR);
	if (dir == NULL) {
		perror ("Can't open directory "PROC_DIR);
		return (3);
	}

	/* read all entries */
	while ((entry = readdir(dir)) != NULL) {
		/* check for a PROC_DIR//exe symlink */
		len = sprintf (lnk_path, "%s/%s/%s",
			PROC_DIR, entry->d_name, "exe");
		len = readlink (lnk_path, tgt_path, sizeof(tgt_path));
		if (len != -1) { /* yep, found one */
			tgt_path[len] = '\0'; /* readlink does not add it */
			if (!strcmp(tgt_path, argv[1]))
				pcount++;
		}
	}

	/* end with no error */
	closedir (dir);
	printf ("%d\n", pcount);
	return (0);
}

Comments are closed.