कार्यक्रम आउटपुट पुनर्निर्देशन


11

प्रोग्राम के आउटपुट को "सिंटैक्स से कुछ संख्या" (जैसे foo 2> myfile) के साथ रीडायरेक्ट करने की कोशिश करते समय , यहां संभावित संख्याएं क्या हैं और वे क्या दर्शाती हैं?

मेरा मानना ​​है कि 1 है /dev/stdout, 2 है /dev/stderr। 5 और 6 के बारे में क्या? क्या 3, 4 या कुछ संख्या 6 से अधिक है?


जवाबों:


11

यह माना गया प्रोग्राम आपके द्वारा निर्दिष्ट किए गए डिस्क्रिप्टर नंबर को दर्ज करने के लिए लिखेगा। निम्नलिखित हैलो विश्व कार्यक्रम पर विचार करें:

#include <stdio.h>

main()
{
   ssize_t i = 0 ;
   printf ("hello world\n") ;
   i = write( 5 , "Bonjour Monde\n", 14 ) ;
   printf ("%d octet dans 5\n", (int) i) ;
}

संकलित करें

me@mybox:~/tmp7$ make hw
cc     hw.c   -o hw

अब एक साधारण रन

me@mybox:~/tmp7$ ./hw
hello world
-1 octet dans 5

5 के लिए कोई फाइल नहीं, इसलिए कोई बाइट नहीं लिखी।

अगला प्रयास:

me@mybox:~/tmp7$ ./hw 5> u
hello world
14 octet dans 5
me@mybox:~/tmp7$ cat u
Bonjour Monde

मैं एक फ़ाइल और फ़ाइल डिस्क्रिप्टर (जैसे 5>u) निर्दिष्ट करते हुए एक आउटपुट प्राप्त करने का प्रबंधन करता हूं ।

व्यवहार में, जब तक कि आपने ऊपर इस तरह के मज़ेदार कार्यक्रम नहीं लिखे हैं, तब तक आप डेटा का उपयोग करने की संभावना नहीं रखते हैं 5>foo

शेल स्क्रिप्ट में, <() का उपयोग करके निर्माण अधिक उपयोगी है:

 diff <( cmd -par 1 ) <(cmd -par 2)

write()रिटर्न ssize_t, नहीं int
एंड्रयू हेनले

यह सवाल का मुख्य बिंदु नहीं है, प्रिंटफ फ़ंक्शन के लिए भी रिटर्न है।
आर्चेमार

लौटे मूल्य का उपयोग नहीं करना गलत प्रकार का उपयोग करने से पूरी तरह अलग है
एंड्रयू हेनल

संपादित मुझे आउटपुट tho में कोई परिवर्तन नहीं दिखाई दे रहा है ...
10:00 बजे

10

संख्या फ़ाइल डिस्क्रिप्टर का प्रतिनिधित्व करती है (फाइलों को हैंडल जो खोला गया है)।

शेल में आमतौर पर 3 सेट होते हैं,

० - स्टड १ - स्टडआउट २ - स्टडर

लेकिन आगे की फाइलें खोली जा सकती हैं, और संख्या वृद्धि।


7

वे नंबर फाइल डिस्क्रिप्टर हैं । जैसा कि आपने उल्लेख किया, ऐसे कई हैं जो स्वचालित रूप से बनाए गए हैं। जैसे अन्य फाइलें या फाइल जैसी चीजें खोली जाती हैं, उन्हें अन्य नंबर मिलेंगे।

किसी विशेष कार्यक्रम में उपयोग किए जाने वाले नंबर इस बात पर निर्भर होते हैं कि उस प्रोग्राम द्वारा क्या फाइलें खोली गई हैं, या अन्यथा उपयोग की गई हैं। उदाहरण के लिए, यदि आप मौजूदा स्टड को "सेव" करना चाहते हैं और अस्थायी रूप से स्टाइन को कहीं और से रीडायरेक्ट करना चाहते हैं, तो इसे बाद में रिस्टोर करें, आप कुछ ऐसा कर सकते हैं:

exec 4<&0
exec < /some/file
#process
exec 0<&4 4<&- # restore stdin and close our duplicate

तो इस स्क्रिप्ट 4में कम से कम कुछ समय के लिए एक फाइल डिस्क्रिप्टर उपलब्ध होगा । यह 4 कुछ भी हो सकता है जो उपयोग में नहीं है (हालांकि, इस बात की सीमा है कि एक प्रक्रिया में कितनी फाइलें हो सकती हैं, लेकिन इस सीमा के भीतर कुछ भी)।

आप देख सकते हैं कि एक प्रक्रिया में कौन से फ़ाइल डिस्क्रिप्टर खुले हैं, और वे कहाँ से खुले हैं /proc/<pid>/fd। यह उस प्रक्रिया के लिए सभी ओपन फाइल डिस्क्रिप्टर दिखाता है <pid>और वे कौन सी फाइल से जुड़े हैं।


0

किसी भी प्रक्रिया को फाइल डिस्क्रिप्टर के रूप में पूर्णांक संख्या मिलती है, जहां POSIX में तीन आरक्षित हैं: 0 स्टडिन है, 1 स्टडआउट है और 2 स्टेडर है। आगे जो भी फाइलें होंगी उन्हें आगे के नंबर दिए जाएंगे। आप इसे इस प्रोग्राम से आसानी से जांच सकते हैं, इसे fdtest.c के रूप में सहेज सकते हैं , ताकि रनटाइम के दौरान यह अपना प्रोग्राम कोड खोले:

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    int fd = open("fdtest.c", O_RDONLY);
    printf("%d\n", fd);
    close(fd);
    return 0;
}

इसे संकलित करें:

gcc fdtest.c -o fdtest

चलाओ:

./fdtest

आपको जो आउटपुट मिलेगा वह कुछ इस प्रकार है:

3

... जो चर द्वारा निर्दिष्ट फ़ाइल के फ़ाइल डिस्क्रिप्टर की संख्या है fd

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.