সি / 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প্রথম দৌড়ে এটি আউটপুট হয়?