C भाषा write फंक्शनको पूर्ण विश्लेषण | प्रयोगदेखि समाधानसम्म

目次

1. परिचय

C भाषा प्रणाली प्रोग्रामिङ र एम्बेडेड प्रणालीहरू जस्ता विभिन्न क्षेत्रमा व्यापक रूपमा प्रयोग हुने शक्तिशाली प्रोग्रामिङ भाषा हो। त्यसै बीच, write फङ्सन कम स्तरको इनपुट/आउटपुट अपरेसन गर्दा अनिवार्य फङ्सन मध्ये एक हो। यस लेखमा, write फङ्सनको आधारभूतदेखि अनुप्रयोगसम्मलाई विस्तृत रूपमा व्याख्या गरी, पाठकलाई व्यावहारिक प्रोग्राम निर्माण गर्न सहयोग गर्नेछौं।

2. write फङ्क्शनको मूलभूत

write फङ्क्शन के हो?

write फङ्क्शन C भाषा को सिस्टम कल मध्ये एक हो, फाइल डिस्क्रिप्टर मार्फत डेटा लेख्न प्रयोग गरिन्छ। यो फङ्क्शन प्रयोग गरेर, मानक आउटपुट वा फाइल जस्ता ठाँउहरूमा डेटा सिधै पठाउन सम्भव हुन्छ।

write फङ्क्शनको परिभाषा

निम्नलिखित write फङ्क्शनको सिग्नेचर हो।

ssize_t write(int fd, const void *buf, size_t count);
  • रिटर्न मान: वास्तविकमा लेखिएको बाइटको संख्या (त्रुटि हुँदा -1 फर्काउँछ)।
  • तर्कहरूको व्याख्या:
  • fd(फाइल डिस्क्रिप्टर): लेखन गन्तव्यलाई जनाउने पूर्णांक मान। मानक आउटपुट (1)या मानक त्रुटि(2)जस्तै … पनि निर्दिष्ट गर्न सकिन्छ।
  • buf(बफर): लेख्नुपर्ने डेटा भण्डारण गरिएको मेमोरीको ठेगाना।
  • count(लेखन गर्ने बाइट संख्या): बफरबाट लेखिने डेटाको आकार।

प्रयोग दृश्यहरू

  • मानक आउटपुटमा डेटा आउटपुट गर्नुहोस्।
  • फाइलमा बाइनरी डेटा वा पाठ भण्डारण गर्नुहोस्।
  • एम्बेडेड सिस्टम र OS कर्नेल भित्रको निम्न-स्तरको डेटा सञ्चालन।

त्रुटि ह्यान्डलिङ

write फङ्क्शनले त्रुटि फिर्ता गर्दा, कारण पत्ता लगाउनको लागि errno जाँच गर्नुहोस्। तल त्रुटिको उदाहरणहरू छन्।

  • EACCES: फाइलमा लेख्न अनुमति छैन।
  • EBADFअमान्य फाइल डिस्क्रिप्टर निर्दिष्ट गरिएको छ।
  • EFAULT: अवैध बफर ठेगाना निर्दिष्ट गरिएको छ।

त्रुटि ह्यान्डल गर्ने कोड उदाहरण:

if (write(fd, buf, count) == -1) {
    perror("write error");
}
年収訴求

3. writeफङ्क्शनको प्रयोग उदाहरण

मानक आउटपुटमा स्ट्रिङ्ग लेखन

writeफङ्क्शनलाई प्रयोग गरेर, मानक आउटपुट(कन्सोल स्क्रिन)मा स्ट्रिङ्ग देखाउने आधारभूत उदाहरण हो।

#include <unistd.h>
int main() {
    const char *message = "Hello, World!
";
    write(1, message, 14); // 1 ले मानक आउटपुट जनाउँछ
    return 0;
}

बुँदा:

  • 1यो मानक आउटपुटको फाइल डिस्क्रिप्टर हो।
  • बफर साइजको रूपमा १४ (स्ट्रिङको लम्बाइ) निर्दिष्ट गरिएको छ।
  • आउटपुट परिणाम ‘Hello, World!’ हुनेछ।

फाइलमा डेटा लेखन

अर्को, writeफङ्क्शनलाई प्रयोग गरेर फाइलमा डेटा लेख्ने उदाहरण हो।

#include <fcntl.h>
#include <unistd.h>
int main() {
    int fd = open("example.txt", O_WRONLY | O_CREAT, 0644);
    if (fd == -1) {
        perror("open error");
        return 1;
    }
    const char *data = "This is a test.
";
    ssize_t bytes_written = write(fd, data, 16);
    if (bytes_written == -1) {
        perror("write error");
    } else {
        printf("Successfully wrote %zd bytes.
", bytes_written);
    }
    close(fd);
    return 0;
}

बुँदा:

  • openफङ्सन प्रयोग गरेर फाइल खोल्नुहोस्,writeडेटा लेखेर,closeफाइल बन्द गर्नुहोस्।
  • O_WRONLYलेखन‑केवल हो,O_CREATयो विकल्प हो जुन फाइल अवस्थित नभएमा सिर्जना गर्दछ।
  • अधिकार0644मालिकलाई पढ्न‑लिख्न अनुमति दिइन्छ, अन्यलाई मात्र पढ्न अनुमति दिइन्छ।

बाइनरी डेटा लेखन

writeफङ्क्शन बाइनरी डेटा सिधै लेख्ने अवस्थामा पनि प्रयोग गरिन्छ।

#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>
int main() {
    int fd = open("binary.dat", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        perror("open error");
        return 1;
    }
    uint8_t buffer[4] = {0xDE, 0xAD, 0xBE, 0xEF}; // 4 बाइटको बाइनरी डेटा
    ssize_t bytes_written = write(fd, buffer, sizeof(buffer));
    if (bytes_written == -1) {
        perror("write error");
    } else {
        printf("Successfully wrote %zd bytes.
", bytes_written);
    }
    close(fd);
    return 0;
}

बुँदा:

  • uint8_tप्रकारको बफर प्रयोग गरेर, हामी ४ बाइटको बाइनरी डेटा लेख्छौं।
  • O_TRUNCयसलाई निर्दिष्ट गरेर, विद्यमान डेटा हटाइन्छ र नयाँ लेखिन्छ।

ध्यान दिनु पर्ने बुँदा

  • लेखन गरिने डाटाको आकार (countलाई सही रूपमा निर्दिष्ट गर्न आवश्यक छ। असटीक मान निर्दिष्ट गर्दा, अवांछित डेटा लेखिने सम्भावना हुन्छ।
  • बफरको मेमोरी ठेगाना वैध छ कि छैन जाँच गर्नुहोस्। अवैध ठेगाना निर्दिष्ट गर्दा सेग्मेन्टेशन फोल्ट हुन्छ।

4. writeफंक्शन रprintfफंक्शनको फरक

printfफंक्शनको विशेषता

printfफंक्शनलाई, ढाँचा सहितको डेटा मानक आउटपुटमा प्रिन्ट गर्न प्रयोग गरिन्छ। तल यसको विशेषताहरू देखाइएका छन्।

  1. फर्म्याट सुविधा
  • printfयो फर्म्याट निर्दिष्टक हो (उदाहरण: %d, %s)को प्रयोग गरेर, संख्याहरू र स्ट्रिङहरूलाई फर्म्याट गरेर आउटपुट गर्न सकिन्छ।
  • उदाहरण:
    c int value = 42; printf("The answer is %d ", value);
    आउटपुट परिणाम:
    The answer is 42
  1. उच्च-स्तरीय सञ्चालन
  • printfयो मानक पुस्तकालयको एक भाग हो, र आन्तरिक रूपमाwriteहामी फङ्सन प्रयोग गरिरहेका छौं।
  • आउटपुट डेटा अस्थायी रूपमा बफरमा भण्डारण गरिन्छ र उपयुक्त समयमा लेखिन्छ।
  1. लक्ष्य केवल मानक आउटपुट हो।
  • आउटपुट गन्तव्य मानक आउटपुटमा सीमित छ, र फाइल डिस्क्रिप्टरलाई प्रत्यक्ष रूपमा निर्दिष्ट गर्न सकिँदैन।

writeफंक्शनको विशेषता

writeफंक्शनले, अझै कम स्तरको अपरेसन प्रदान गर्दछ। तल यसको विशेषताहरू छन्।

  1. फर्म्याट सुविधा छैन
  • writeयसमा फर्म्याटिङ्ग सुविधा छैन, र निर्दिष्ट गरिएको डेटा त्यसै गरी आउटपुट गर्दछ।
  • उदाहरण:
    c const char *message = "Hello, World! "; write(1, message, 14);
    आउटपुट परिणाम:
    Hello, World!
  1. निम्न-स्तरको सञ्चालन
  • डेटा तुरुन्तै लेखिन्छ, र बफरिङ् गरिँदैन।
  • मानक लाइब्रेरीमा निर्भर नगरी, प्रत्यक्ष रूपमा सिस्टम कलहरूलाई कल गर्दछ।
  1. लचिलो आउटपुट गन्तव्य
  • फाइल डिस्क्रिप्टर प्रयोग गरेर, तपाईंले मानक आउटपुट बाहेक मनपर्ने फाइल वा उपकरणमा डेटा लेख्न सक्नुहुन्छ।

बफरिङको फरक

दुबैको मुख्य फरक भनेको, डेटा बफरिङ विधि हो।

  • printfफंक्शन:
    डेटा मानक लाइब्रेरीको आन्तरिक बफरमा भण्डारण गरिन्छ, र शर्तहरू पूरा हुँदा एकै पटक लेखिन्छ (उदाहरण: नयाँ लाइनमा वा बफर पूर्ण हुँदा)।
  • फाइदा: प्रदर्शन सुधार हुन्छ।
  • नुकसान: बफर फ्ल्यास नगरेमा डेटा देखिँदैन।
  • writeफंक्शन:
    बफरिङ नगरी, कल गरिँदा प्रत्येक पटक तुरुन्तै डेटा आउटपुट गर्दछ।
  • फाइदा: यो निश्चित रूपमा तुरुन्तै आउटपुट हुन्छ।
  • डेमेरिट: बारम्बार कल गर्दा प्रदर्शन घट्न सक्छ।

प्रयोग बिचको बिन्दुहरू

शर्तसिफारिस गरिएको फङ्सनकारण
फर्म्याट सहितको आउटपुट आवश्यक छprintfतपाईं फर्म्याट स्पेसिफायरहरू प्रयोग गरेर डेटा फर्म्याट गर्न सक्नुहुन्छ।
तत्कालिक आउटपुट आवश्यक छwriteबफरिङ बिना तुरुन्तै डेटा लेख्नुहोस्
फाइल वा डिभाइसमा आउटपुटwriteकुनै पनि फाइल डिस्क्रिप्टरलाई समर्थन गर्न सक्छ
प्रदर्शन केन्द्रितprintf(शर्तसहित)मानक आउटपुटमा दक्षतापूर्वक बफरिङ् गर्ने

उदाहरण प्रयोगमा तुलना

printfको प्रयोग:

#include <stdio.h>
int main() {
    int value = 42;
    printf("Value: %d
", value);
    return 0;
}

writeको प्रयोग:

#include <unistd.h>
int main() {
    const char *message = "Value: 42
";
    write(1, message, 10);
    return 0;
}

दुबैको नतिजा समान छ, तर आन्तरिक प्रक्रिया धेरै फरक छ भन्ने कुरा बुझ्नु महत्त्वपूर्ण छ।

5. फाइल अपरेसनमा write कार्यको प्रयोग

फाइल खोल्ने र बन्द गर्ने

फाइलमा डेटा लेख्नको लागि, पहिले फाइल खोल्न आवश्यक छ।open कार्य प्रयोग गरेर फाइल खोल्नुहोस्, र लेख्ने अपरेसन समाप्त भएपछिclose कार्यले फाइल बन्द गर्नुहोस्।

मूलभूत कोड उदाहरण:

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
    int fd = open("example.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        perror("open error");
        return 1;
    }
    close(fd);
    return 0;
}

मुख्य बुँदा:

  • O_WRONLY: फाइललाई लेखन‑केवल मोडमा खोल्छ।
  • O_CREAT: यदि फाइल अवस्थित छैन भने, नयाँ बनाइन्छ।
  • O_TRUNC: यदि फाइल अवस्थित छ भने, यसको सामग्री खाली गरिनेछ।
  • तीस्रो तर्क (0644फाइलको पहुँच अधिकार सेट गर्नुहोस्।

फाइलमा डेटा लेख्ने प्रक्रिया

write कार्य प्रयोग गरेर विशिष्ट लेख्ने उदाहरण देखाइन्छ।

कोड उदाहरण:

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
    int fd = open("data.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        perror("open error");
        return 1;
    }
    const char *content = "Hello, File!
";
    ssize_t bytes_written = write(fd, content, 13);
    if (bytes_written == -1) {
        perror("write error");
    } else {
        printf("Successfully wrote %zd bytes.
", bytes_written);
    }
    close(fd);
    return 0;
}

मुख्य बुँदा:

  • writeफङ्सनले निर्दिष्ट गरेको स्ट्रिङलाई फाइलमा लेख्छ।
  • रिटर्न मानबाट वास्तविक रूपमा लेखिएको बाइटको संख्या जाँच गरिन्छ।
  • यदि त्रुटि हुन्छ भने,perrorलाई प्रयोग गरेर त्रुटि विवरण देखाइन्छ।

त्रुटि ह्यान्डलिंग र ध्यान दिनुपर्ने बुँदा

फाइल अपरेसनमाwrite कार्यमा त्रुटि उत्पन्न हुन सक्छ। प्रतिनिधि त्रुटिहरू र तिनीहरूको समाधान तल देखाइन्छ।

  1. फाइल खोल्न सकिँदैनopenको त्रुटि)
  • कारण: फाइल अवस्थित छैन, वा पहुँच अधिकार पर्याप्त छैन।
  • उपाय: सही पथ र उपयुक्त अनुमतिहरू जाँच गर्नुहोस्, र आवश्यक परेमाO_CREATनिर्दिष्ट गर्नुहोस्।
  1. लेखन त्रुटि (writeको त्रुटि)
  • कारण: डिस्क स्थान अपुरो, फाइल सिस्टमको समस्या।
  • उपाय: त्रुटि कोडerrnoजाँच गरेर, लगहरू आउटपुट गरेर कारण पत्ता लगाउनुहोस्।
  1. क्लोज त्रुटि (closeको त्रुटि)
  • कारण: फाइल डिस्क्रिप्टर अवैध छ।
  • उपाय: फाइल सहीसँग खुलेको छ कि छैन जाँच गर्नुहोस्।

त्रुटि ह्यान्डलिंग कोड उदाहरण:

if (write(fd, content, 13) == -1) {
    perror("write error");
}

फाइल अपरेसनको व्यावहारिक उदाहरण

बहु-लाइनको पाठलाई फाइलमा लेख्ने उदाहरण देखाइन्छ।

कोड उदाहरण:

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
    int fd = open("multiline.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        perror("open error");
        return 1;
    }
    const char *lines[] = {"Line 1
", "Line 2
", "Line 3
"};
    for (int i = 0; i < 3; i++) {
        if (write(fd, lines[i], 7) == -1) {
            perror("write error");
            close(fd);
            return 1;
        }
    }
    close(fd);
    return 0;
}

मुख्य बुँदा:

  • हामी एरे प्रयोग गरेर धेरै पंक्तिको डेटा लेख्छौं।
  • हामी लूप भित्र त्रुटि जाँच गरेर सुरक्षा सुनिश्चित गर्छौं।

6. ट्रबलशूटिंग

write फङ्क्शन -1 फिर्ता गर्छ

कारण:
write फङ्क्शन -1 फिर्ता गर्दा, त्रुटि देखा पर्छ। सम्भावित कारणका उदाहरणहरू तल देखाइएका छन्।

  1. अमान्य फाइल डिस्क्रिप्टर
  • कारण: फाइल ठीकसँग खोलिएको छैन, वा पहिले नै बन्द गरिएको छ।
  • समाधान:
    फाइल डिस्क्रिप्टर वैध छ कि छैन जाँच गर्नुहोस्।
    c if (fd < 0) { perror("Invalid file descriptor"); return 1; }
  1. डिस्क स्थान अपुरै छ
  • कारण: तपाईंले लेख्न खोज्दै हुनुहुने डिभाइसको स्टोरेज पर्याप्त छैन।
  • समाधान: डिस्क क्षमताको जाँच गर्नुहोस्, र पर्याप्त खाली स्थान सुनिश्चित गर्नुहोस्।
  1. पहुँच अधिकारहरू अपर्याप्त छन्
  • कारण: लेखन गन्तव्य फाइल वा निर्देशिकामा आवश्यक अनुमति छैन।
  • समाधान:
    फाइल वा डाइरेक्टरीको अनुमति परिवर्तन गरिन्छ।
    bash chmod u+w फाइल नाम

केही डेटा लेखिँदैन

कारण:
write फङ्क्शनले निर्दिष्ट बाइट संख्य(count)जति मात्र डेटा लेख्ने ग्यारेन्टी गर्दैन। विशेष गरी फाइल डिस्क्रिप्टर सॉकेट वा पाइप भएमा, डेटा आंशिक रूपमा मात्र लेखिन सक्छ।

समाधान:
नलेखिएको भागलाई ट्र्याक गर्दै लूपमा प्रक्रिया गर्नुहोस्।

उदाहरण:

#include <unistd.h>
ssize_t robust_write(int fd, const void *buf, size_t count) {
    ssize_t total_written = 0;
    const char *buffer = buf;
    while (count > 0) {
        ssize_t written = write(fd, buffer, count);
        if (written == -1) {
            perror("write error");
            return -1;
        }
        total_written += written;
        buffer += written;
        count -= written;
    }
    return total_written;
}

सेग्मेन्टेशन फॉल्ट देखा पर्छ

कारण:
write फङ्क्शनलाई पास गरिएको बफरको ठेगाना अवैध भएमा, सेग्मेन्टेशन फॉल्ट देखा पर्छ।

समाधान:

  • बफरलाई उपयुक्त रूपमा आरम्भ गरिएको छ कि छैन जाँच गर्नुहोस्।
  • प्वाइन्टरको मेमोरी आवंटन सही छ कि छैन जाँच गरिन्छ।

उदाहरण(गलत कोड):

char *data;
write(1, data, 10); // data आरम्भ गरिएको छैन

सुधारिएको उदाहरण:

char data[] = "Hello";
write(1, data, 5); // प्रारम्भिक डेटा प्रयोग गर्नुहोस्

लेखन रोकिएछ

कारण:
सिग्नल उत्पन्न हुँदाwrite फङ्क्शन रोकिएर सक्छ।

समाधान:
त्रुटि कोडEINTR जाँच गरी, आवश्यक परे पुनः प्रयास गर्नुहोस्।

उदाहरण:

#include <errno.h>
#include <unistd.h>
ssize_t retry_write(int fd, const void *buf, size_t count) {
    ssize_t result;
    do {
        result = write(fd, buf, count);
    } while (result == -1 && errno == EINTR);
    return result;
}

लेखिएको सामग्री अनपेक्षित नतिजा बनिन्छ

कारण:

  • लेखन गर्ने बफरको आकार गलत छ।
  • बफरमा अपेक्षित नभएको डेटा समावेश गरिएको छ।

समाधान:

  • लेखन गरिने डाटाको आकार सही रूपमा निर्दिष्ट गर्नुहोस्।
  • डिबगिङ उपकरण (उदाहरण: gdbबफरको सामग्री जाँच गर्न ) प्रयोग गर्नुहोस्।
gdb ./your_program

ट्रबलशूटिंग सारांश

  • त्रुटि कोड जाँच गर्नुहोस्
  • त्रुटि हुँदाerrnoलाई प्रयोग गरेर कारण पत्ता लगाउँछौं।
  • उदाहरण: if (write(fd, buf, size) == -1) { perror("write error"); }
  • डिबगिङ विधि
  • straceलाई प्रयोग गरेर सिस्टम कलको व्यवहार ट्र्याक गर्ने।
  • लॉगहरू आउटपुट गरेर समस्या भएको स्थान पहिचान गर्नुहोस्।

7. FAQ

Q1: write फङ्क्शनले स्ट्रिङ लेख्दा ध्यान दिनुपर्ने बुँदाहरू के हुन्?

A:
write फङ्क्शनले निर्दिष्ट बाइट सङ्ख्या (count) जत्तिकै मात्र डाटा लेख्छ, तर स्ट्रिङ शून्य-समाप्त (null-terminated) भएको कुरालाई विचार गर्दैन। त्यसैले, लेख्न चाहिने डाटाको सही आकार निर्दिष्ट गर्न आवश्यक छ।

उदाहरण (गल्ती):

const char *message = "Hello, World!";
write(1, message, sizeof(message)); // प्वाइन्टरको आकार प्राप्त हुन्छ

सुधारिएको उदाहरण:

const char *message = "Hello, World!";
write(1, message, strlen(message)); // सही स्ट्रिङको लम्बाइ निर्दिष्ट गर्नुहोस्

Q2: write फङ्क्शनको फर्किने मान नकारात्मक भएमा, कसरी सम्बोधन गर्ने?

A:
फर्किने मान -1 भएमा, त्रुटि भएको छ। यस समयमा, errno जाँच गरेर कारण पहिचान गर्न सकिन्छ। तल सामान्य त्रुटि कोडहरू देखाइएका छन्।

  • EACCES: फाइलमा लेख्ने अनुमति छैन।
  • ENOSPC: डिस्क क्षमता अपुरै छ।
  • EINTR: सिग्नल द्वारा अवरोधित गरियो।

उदाहरण (त्रुटि ह्यान्डलिङ):

if (write(fd, buffer, size) == -1) {
    perror("write error");
    // आवश्यकता अनुसार त्रुटि कोडलाई लगमा आउटपुट गर्नुहोस्
}

Q3: write फङ्क्शन र fwrite फङ्क्शन बीचको भिन्नता के हो?

A:
write फङ्क्शन र fwrite फङ्क्शन दुवै डाटा आउटपुट गर्न प्रयोग हुन्छन्, तर निम्न भिन्नताहरू छन्।

विशेषताwriteकार्यfwriteकार्य
स्तरनिम्न-स्तरको सिस्टम कलउच्च-स्तरीय मानक पुस्तकालय कार्यहरू
बफरिङबफरिङ बिनामानक पुस्तकालयद्वारा बफरिङ
आउटपुट गन्तव्य निर्दिष्ट गर्ने तरिकाफाइल डिस्क्रिप्टरFILE *(स्ट्रिम)
उपयोग उदाहरणफाइल सिस्टम र सॉकेटफाइल सञ्चालन (विशेष गरी पाठ प्रक्रिया)

Q4: write फङ्क्शन प्रयोग गर्दा, कसरी डिबग गर्ने?

A:
निम्न विधिहरू प्रयोग गर्दा, write फङ्क्शनका समस्याहरूलाई कुशलतापूर्वक डिबग गर्न सकिन्छ।

  1. straceकमाण्ड प्रयोग गर्नुहोस्
  • writeफङ्सनको सिस्टम कलहरू ट्र्याक गरेर, पठाइएका डेटा र त्रुटिहरू जाँच गर्नुहोस्।
  • उदाहरण:
    bash strace ./your_program
  1. लॉग आउटपुट
  • लेखिएको डाटाको सामग्री र आकारलाई प्रोग्राम भित्र लगको रूपमा दर्ता गरिन्छ।
  1. GDB (डिबगर) प्रयोग गर्नुहोस्
  • लेखनको समयमा बफरको सामग्री जाँच गरेर, डाटा सही छ कि छैन जाँच गरिन्छ।

Q5: फाइल लेख्दा, इच्छित आकारभन्दा कम डाटा मात्र लेखिनुको कारण के हो?

A:
write फङ्क्शनले एकैचोटि लेख्ने डाटा आकार फाइल डिस्क्रिप्टर वा प्रणालीको अवस्थामा निर्भर हुन्छ। उदाहरणका लागि, सकेट वा पाइप प्रयोग गर्दा, बफर आकार सीमाका कारण केही डाटा मात्र लेखिन सक्छ।

समाधान:
अलेखित भागलाई ट्र्याक गर्दै, लूपमा write दोहोर्याउनुहोस्।

ssize_t robust_write(int fd, const void *buf, size_t count) {
    size_t remaining = count;
    const char *ptr = buf;
    while (remaining > 0) {
        ssize_t written = write(fd, ptr, remaining);
        if (written == -1) {
            perror("write error");
            return -1;
        }
        remaining -= written;
        ptr += written;
    }
    return count;
}

Q6: write फङ्क्शन थ्रेड-सेफ हो?

A:
write फङ्क्शन थ्रेड-सेफ मानिन्छ, तर धेरै थ्रेडहरूले एकै फाइल डिस्क्रिप्टरलाई एकैसाथ सञ्चालन गर्दा, डाटा मिश्रित हुन सक्छ।

समाधान:

  • सिंक्‍रनाइज़ेशन मेकानिज्म (जस्तै: म्युटेक्स) प्रयोग गरेर थ्रेडहरू बीचको प्रतिस्पर्धा रोक्नुहोस्।

8. सारांश

यस लेखमा, C भाषा को write फलनको बारेमा, आधारभूतदेखि उन्नतसम्म, त्रुटि ह्यान्डलिङ्ग र printf सँगको भिन्नता, ट्रबलशुटिङ्ग सम्म विस्तृत रूपमा व्याख्या गरिएको छ। तल मुख्य बुँदाहरूको पुनरावलोकन गरिन्छ।

write फलनको महत्व

  • writeयो फङ्सन निम्न-स्तरको डेटा आउटपुट सम्भव बनाउने सिस्टम कल हो, र यो फाइल, मानक आउटपुट, सॉकेट आदि जस्ता विभिन्न आउटपुट गन्तव्यहरूलाई समर्थन गर्दछ।
  • फर्म्याटिङ्ग सुविधा छैन, तर तत्काल आउटपुट र बाइनरी डेटा सञ्चालनमा यो अत्यन्तै उपयोगी छ।

आधारभूत प्रयोग विधि

  • writeफंक्शनको सिग्नेचर र आर्गुमेन्टहरू:
  ssize_t write(int fd, const void *buf, size_t count);
  • fd: आउटपुट गन्तव्य निर्दिष्ट गर्ने फाइल डिस्क्रिप्टर।
  • buf: लेखनको लागि डेटा भण्डारण गरिएको बफर।
  • count: लेखन गरिने बाइटको संख्या।
  • मानक आउटपुट, फाइल, र बाइनरी डेटा लेखनका उदाहरणहरू मार्फत, मैले यसको लचिलोपन सिकें।

printf सँगको भिन्नता

  • writeयो निम्न-स्तरमा प्रत्यक्ष रूपमा आउटपुट गर्दछ, र बफरिङ् गर्दैन।
  • अर्कोतर्फ,printfयो फर्म्याट सुविधा उपलब्ध गराउँछ, र उच्च स्तरको आउटपुट सञ्चालन सम्भव बनाउँछ।
  • दुवैलाई प्रयोगको आधारमा फरक गरेर प्रयोग गर्ने कुरा महत्त्वपूर्ण छ।

त्रुटि ह्यान्डलिङ्ग र डिबगिङ्ग

  • writeफङ्सनमा त्रुटि हुँदा,errnoलाई प्रयोग गरेर कारण पत्ता लगाउन सकिन्छ।
  • सामान्य त्रुटिहरू (अवैध फाइल डिस्क्रिप्टर, डिस्क स्थानको अभाव, पहुँच अधिकारको अभाव आदि) को समाधान गर्ने तरिकाहरू परिचय गरियो।
  • straceडिबगिङ टूलहरू प्रयोग गरेर ट्रबलशूटिङलाई दक्षतापूर्वक बनाइ सकिन्छ।

ट्रबलशुटिङ्ग र FAQ

  • आंशिक लेखन वा अवरोधित अवस्थामा कसरी प्रक्रिया गर्ने भनेर व्याख्या गरियो, र पुनः प्रयास गर्ने कार्यान्वयन उदाहरण प्रस्तुत गरियो।
  • FAQ सेक्शनमा,writeफङ्सनसँग सम्बन्धित सबै प्रश्नहरूलाई समग्र रूपमा समेटिएको छ।

अर्को चरण

  • यो लेखमा सिकिएकोwriteफङ्सनको ज्ञानको आधारमा, C भाषाका अन्य सिस्टम कलहरू (उदाहरण: read, lseek, closeउनीहरूलाई संयोजन गरेर व्यावहारिक प्रोग्राम बनाउनुहोस्।
  • फाइल सञ्चालन र सॉकेट संचार जस्ता थप उन्नत अनुप्रयोग उदाहरणहरूमा पनि प्रयास गर्नुहोस्।

@@write फलनको समझ गहिरो भए, C भाषा मा सिस्टम प्रोग्रामिङ्गको आधारलाई अझ बलियो बनाउन सकिन्छ। यो लेखले तपाईंको प्रोग्रामिङ्ग कौशल सुधारमा सहयोग गर्ने आशा गर्दछ। पढ्नुभएकोमा धन्यवाद!