Cı / POSIX
Bu program, ne sıklıkta çağrıldığının sayacı olarak kendi yürütülebilir dosyasına sabit bağlantı sayısını kullanır. Başlatıldığı dizinde yeni sabit bağlantıları oluşturur (bu nedenle aynı dosya sisteminde olması garanti edilir), bu nedenle yazma iznine ihtiyaç duyar. Hata işlemeyi atladım.
Bu dizinde oluşturulan sabit bağlantılardan biriyle aynı ada sahip önemli bir dosyanız olmadığından emin olmanız gerekir, aksi takdirde dosyanın üzerine yazılır. Yürütülebilir örneğin adı verilirse counter
, sabit bağlantılar ismi verilecek counter_1
, counter_2
vs.
#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;
}
Örnek run (yürütülebilir dosya zaten çalıştırılmışsa ilk satır sayacı sıfırlar):
$ 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
ilk seferde çıktı ?