Listing 1. bind

/* bind - simple command line tool to set CPU 
 * affinity of a given task
 */

#define _GNU_SOURCE

#include <stdlib.h>
#include <stdio.h>
#include <sched.h>

int main(int argc, char *argv[])
{
    unsigned long new_mask;
    unsigned long cur_mask;
    unsigned int len = sizeof(new_mask);
    pid_t pid;

    if (argc != 3) {
	fprintf(stderr, 
                "usage: %s [pid] [cpu_mask]\n", 
                argv[0]);
	return -1;
    }

    pid = atol(argv[1]);
    sscanf(argv[2], "%08lx", &new_mask);

    if (sched_getaffinity(pid, len,
                          &cur_mask) < 0) {
	perror("sched_getaffinity");
	return -1;
    }

    printf("pid %d's old affinity: %08lx\n", 
           pid, cur_mask);

    if (sched_setaffinity(pid, len, &new_mask)) {
	perror("sched_setaffinity");
	return -1;
    }

    if (sched_getaffinity(pid, len, 
                          &cur_mask) < 0) {
	perror("sched_getaffinity");
	return -1;
    }

    printf(" pid %d's new affinity: %08lx\n", 
           pid, cur_mask);

    return 0;
}
