C:
יצירת קובץ זמני

איך לעשות:

יצירת קובץ זמני בשפת התכנות C יכולה להשתמש בפונקציות כמו tmpfile() ו-mkstemp().

שימוש ב-tmpfile(): הפונקציה הזו יוצרת קובץ זמני ייחודי שנמחק באופן אוטומטי כאשר התוכנית מסתיימת או הקובץ נסגר.

#include <stdio.h>
    
int main() {
    FILE *temp = tmpfile();
    if (temp == NULL) {
        perror("Failed to create temporary file");
        return 1;
    }

    // כתיבת נתונים לקובץ הזמני
    fputs("This is a test.\n", temp);

    // חזור וקרא מה שכתבנו
    rewind(temp);
    char buffer[1024];
    while (fgets(buffer, sizeof(buffer), temp) != NULL) {
        printf("%s", buffer);
    }

    // נמחק באופן אוטומטי בעת סגירה או יציאה מהתכנית
    fclose(temp);

    return 0;
}

דוגמא לפלט:

This is a test.

שימוש ב-mkstemp(): מספק שליטה רבה יותר על מיקום הקובץ הזמני והרשאותיו. דורש מחרוזת תבנית שמסתיימת ב-XXXXXX שאותה הוא מחליף ברצף ייחודי כדי למנוע התנגשויות שמות.

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

int main() {
    char template[] = "/tmp/mytemp-XXXXXX";
    int fd = mkstemp(template);

    if (fd == -1) {
        perror("Failed to create temporary file");
        return 1;
    }
    
    printf("Temporary file created: %s\n", template);

    // קבצים זמניים שנוצרו עם mkstemp() צריכים להימחק באופן ידני
    unlink(template);

    close(fd);
    return 0;
}

דוגמא לפלט:

Temporary file created: /tmp/mytemp-abc123

עיון נוסף

המושג של קבצים זמניים אינו ייחודי ל-C אלא הוא פונקציונליות נפוצה בסביבות תכנות רבות בשל התועלת שבהולכת נתונים זמניים. הפונקציה tmpfile(), שקיימת בתקן ISO C, יוצרת קובץ עם שם ייחודי בתיקייה סטנדרטית, אך קיומו חולף, מה שהופך אותו לאידיאלי לפעולות בטוחות או זמניות.

מגבלה משמעותית של tmpfile() היא תלותה בתיקייה הזמנית הברירת מחדל, אשר עשויה שלא להתאים לכל היישומים במיוחד במובן של הרשאות או בטיחות. לעומת זאת, mkstemp() מאפשר לציין את התיקייה ומבטיח יצירת קובץ בטוח עם שמות ייחודיים על ידי שינוי מחרוזת התבנית המוגשת, ומציע פתרון גמיש יותר במחיר של ניהול קבצים ידני.

עם זאת, יצירת קבצים זמניים יכולה להציג סיכוני אבטחת מידע, כמו תחרויות, אם לא מטופלים כראוי. לדוגמה, tmpfile() ו-mkstemp() מטפלים באספקטים שונים של יצירת קובץ זמני בטוח (מחיקה אוטומטית וייצור שם בטוח, בהתאמה), אך אף אחת מהן אינה מהווה פתרון מושלם. מפתחים חייבים לשקול את פרטי הצורך באבטחה של היישום שלהם, כולל סיכונים פוטנציאליים הנובעים מקבצים זמניים, וייתכן ויצטרכו ליישם זהירויות נוספות מעבר למה שהפונקציות האלו מספקות.

בנוף הרחב יותר של התכנות, חלופות כמו אחסון בזיכרון (למשל, באמצעות מבני נתונים דינמיים או קבצים ממופים לזיכרון) עשויות להציע ביצועים או בטיחות טובים יותר לטיפול בנתונים זמניים. עם זאת, קבצים זמניים פיזיים עדיין מהווים כלי חיוני במצבים רבים, במיוחד עבור סטים גדולים של נתונים או כאשר מעורבת תקשורת בין-תהליכית.