C / POSIX
Dieses Programm verwendet die Anzahl der festen Links zu seiner eigenen ausführbaren Datei als Zähler dafür, wie oft es aufgerufen wurde. Es erstellt die neuen Hardlinks in dem Verzeichnis, aus dem es gestartet wurde (da es sich auf diese Weise garantiert im selben Dateisystem befindet), für das daher eine Schreibberechtigung erforderlich ist. Ich habe die Fehlerbehandlung weggelassen.
Stellen Sie besser sicher, dass Sie keine wichtige Datei mit demselben Namen wie einer der erstellten Hardlinks in diesem Verzeichnis haben, da diese sonst überschrieben wird. Wenn beispielsweise die ausführbare Datei benannt ist counter, werden die Hardlinks genannt werden counter_1, counter_2usw.
#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;
}
Beispiellauf (die erste Zeile setzt den Zähler zurück, falls die ausführbare Datei bereits ausgeführt wurde):
$ 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~
0im ersten Durchgang ausgegeben ?