C / POSIX
Este programa usa la cantidad de enlaces duros a su propio ejecutable como contador de la frecuencia con la que se llamó. Crea los nuevos enlaces duros en el directorio desde el que se inició (porque de esa manera se garantiza que estará en el mismo sistema de archivos), por lo que necesita permiso de escritura. He omitido el manejo de errores.
Es mejor que se asegure de no tener un archivo importante con el mismo nombre que uno de los enlaces duros creados en ese directorio, o se sobrescribirá. Si, por ejemplo, se nombra el ejecutable, se nombrarán counter
los enlaces duros counter_1
, counter_2
etc.
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[])
{
/* get persistent counter */
struct stat selfstat;
stat(argv[0], &selfstat);
int counter = selfstat.st_nlink;
/* determine digits of counter */
int countercopy = counter;
int digits = 1;
while (countercopy /= 10)
++digits;
/* increment persistent counter */
char* newname = malloc(strlen(argv[0]) + digits + 2);
sprintf(newname, "%s_%d", argv[0], counter);
link(argv[0], newname);
/* output the counter */
if (counter & (counter-1)) // this is zero iff counter is a power of two
printf("%d\n", counter);
else
{
/* determine which power of 2 it is */
int power = 0;
while (counter/=2)
++power;
printf("2^%d\n", power);
}
return 0;
}
Ejemplo de ejecución (la primera línea restablece el contador, en caso de que el ejecutable ya se haya ejecutado):
$ rm counter_*
$ ./counter
2^0
$ ./counter
2^1
$ ./counter
3
$ ./counter
2^2
$ ./counter
5
$ ./counter
6
$ ./counter
7
$ ./counter
2^3
$ ./counter
9
$ ls counter*
counter counter_2 counter_4 counter_6 counter_8 counter.c
counter_1 counter_3 counter_5 counter_7 counter_9 counter.c~
0
en la primera ejecución?