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
첫 번째 실행에서 왜 출력 됩니까?