C / POSIX
Program ini menggunakan jumlah tautan keras yang dapat dieksekusi sebagai penghitung dari seberapa sering dipanggil. Itu menciptakan tautan keras baru di direktori tempat ia dimulai (karena dengan cara itu dijamin berada pada sistem file yang sama), yang karenanya memerlukan izin menulis. Saya telah menghilangkan penanganan kesalahan.
Anda lebih baik memastikan bahwa Anda tidak memiliki file penting dengan nama yang sama dengan salah satu tautan keras yang dibuat pada direktori itu, atau itu akan ditimpa. Jika misalnya executable dinamai counter, tautan keras akan dinamai counter_1, counter_2dll.
#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;
}
Contoh run (baris pertama me-reset counter, jika eksekusi sudah dijalankan):
$ 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~
0di jalankan pertama?