न्यूनतम रननीय C POSIX प्रजनन उदाहरण
मैं बेहतर दिखने के लिए अंतर्निहित एपीआई को समझने की सलाह देता हूं।
sleep.c
#define _XOPEN_SOURCE 700
#include <unistd.h>
int main(void) {
sleep(10000);
}
busy.c
#define _XOPEN_SOURCE 700
#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(void) {
int ret = open("sleep.out", O_WRONLY|O_TRUNC);
assert(errno == ETXTBSY);
perror("");
assert(ret == -1);
}
संकलित करें और चलाएं:
gcc -std=c99 -o sleep.out ./sleep.c
gcc -std=c99 -o busy.out ./busy.c
./sleep.out &
./busy.out
busy.out
जोर लगाता है, और perror
आउटपुट:
Text file busy
इसलिए हम मानते हैं कि यह संदेश ग्लिबक में ही हार्डकोड है।
वैकल्पिक रूप से:
echo asdf > sleep.out
बैश आउटपुट बनाता है:
-bash: sleep.out: Text file busy
अधिक जटिल एप्लिकेशन के लिए, आप इसे भी देख सकते हैं strace
:
strace ./busy.out
जिसमें है:
openat(AT_FDCWD, "sleep.out", O_WRONLY) = -1 ETXTBSY (Text file busy)
उबंटू 18.04, लिनक्स कर्नेल 4.15.0 पर परीक्षण किया गया।
त्रुटि नहीं होती है यदि आप unlink
पहले
notbusy.c:
#define _XOPEN_SOURCE 700
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(void) {
assert(unlink("sleep.out") == 0);
assert(open("sleep.out", O_WRONLY|O_CREAT) != -1);
}
फिर संकलित करें और ऊपर दिए गए तरीके से चलाएं, और वे मुखर गुजरते हैं।
यह बताता है कि क्यों यह कुछ कार्यक्रमों के लिए काम करता है लेकिन अन्य नहीं। जैसे यदि आप करते हैं:
gcc -std=c99 -o sleep.out ./sleep.c
./sleep.out &
gcc -std=c99 -o sleep.out ./sleep.c
यह एक त्रुटि उत्पन्न नहीं करता है, भले ही दूसरा gcc
कॉल लिख रहा होsleep.out
।
एक त्वरित से strace
पता चलता है कि GCC लिखने से पहले अनलिंक करता है:
strace -f gcc -std=c99 -o sleep.out ./sleep.c |& grep sleep.out
शामिल हैं:
[pid 3992] unlink("sleep.out") = 0
[pid 3992] openat(AT_FDCWD, "sleep.out", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3
असफल होने का कारण यह नहीं है कि जब आप unlink
फ़ाइल को फिर से लिखते हैं, तो यह एक नया इनकोड बनाता है, और रनिंग एग्जीक्यूटेबल फ़ाइल के लिए एक अस्थायी झूलने वाला इनकोड रखता है।
लेकिन अगर आप बस write
बिना unlink
, तो यह चल रहे निष्पादन योग्य के रूप में एक ही संरक्षित आईनोड को लिखने की कोशिश करता है।
POSIX 7 open()
http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html
[ETXTBSY]
फ़ाइल एक शुद्ध प्रक्रिया (साझा पाठ) फ़ाइल है जिसे निष्पादित किया जा रहा है और टॉगल O_WronLY या O_RRWR है।
आदमी 2 खुला
ETXTBSY
pathname एक निष्पादन योग्य छवि को संदर्भित करता है जिसे वर्तमान में निष्पादित किया जा रहा है और लिखने की पहुंच का अनुरोध किया गया था।
Text file busy
विशिष्ट में त्रुटि, जबकि यह निष्पादित हो रहा है एक निष्पादन को संशोधित करने की कोशिश कर के बारे में है। यहां "टेक्स्ट" इस तथ्य को संदर्भित करता है कि फाइल को संशोधित किया जाना एक चल रहे प्रोग्राम के लिए टेक्स्ट सेगमेंट है । यह एक बहुत ही विशेष मामला है, और सामान्य नहीं है कि आपका उत्तर आपको लगता है। फिर भी, आपका उत्तर पूरी तरह से गलत नहीं है।