सी / 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
पहले रन में आउटपुट क्यों करता है ?