C / POSIX
โปรแกรมนี้ใช้จำนวนฮาร์ดลิงก์ไปยังไฟล์ที่เรียกทำงานได้ของมันเองเป็นตัวนับความถี่ว่ามันถูกเรียกมา มันสร้างฮาร์ดลิงก์ใหม่ในไดเรกทอรีที่เริ่มต้นจาก (เพราะวิธีนี้รับประกันได้ว่าจะอยู่ในระบบไฟล์เดียวกัน) ซึ่งต้องได้รับอนุญาตในการเขียน ฉันไม่ได้จัดการข้อผิดพลาด
คุณควรตรวจสอบให้แน่ใจว่าคุณไม่มีไฟล์สำคัญที่มีชื่อเดียวกันกับหนึ่งในฮาร์ดลิงก์ที่สร้างขึ้นในไดเรกทอรีนั้นหรือจะถูกเขียนทับ ถ้าเช่นปฏิบัติการเป็นชื่อcounter
ที่เชื่อมโยงอย่างหนักจะถูกตั้งชื่อcounter_1
, counter_2
ฯลฯ
#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;
}
ตัวอย่างการรัน (บรรทัดแรกรีเซ็ตตัวนับในกรณีที่เรียกใช้งานได้ถูกรันแล้ว):
$ 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
ในการวิ่งครั้งแรก?