C / POSIX
Chương trình này sử dụng số lượng liên kết cứng để thực thi riêng của nó như là bộ đếm tần suất được gọi. Nó tạo ra các liên kết cứng mới trong thư mục mà nó được bắt đầu (vì theo cách đó nó được đảm bảo nằm trên cùng một hệ thống tệp), do đó cần có sự cho phép ghi. Tôi đã bỏ qua xử lý lỗi.
Bạn nên đảm bảo rằng bạn không có tệp quan trọng nào có cùng tên với một trong những liên kết cứng được tạo trên thư mục đó, nếu không nó sẽ bị ghi đè. Nếu ví dụ: tệp thực thi được đặt tên counter
, các liên kết cứng sẽ được đặt tên counter_1
, counter_2
v.v.
#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;
}
Chạy ví dụ (dòng đầu tiên đặt lại bộ đếm, trong trường hợp tệp thực thi đã được chạy):
$ 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
trong lần chạy đầu tiên?