كيف يمكنك الحصول على اسم ملف مؤقت لاستخدامه في Linux؟

StackOverflow https://stackoverflow.com/questions/29647

  •  09-06-2019
  •  | 
  •  

سؤال

لنفترض أنني أقوم بإنشاء برنامج في لغة C يحتاج إلى استخدام ملف مؤقت.ربما لا يكون إنشاء ملف مؤقت مخصص في /tmp فكرة جيدة.هل هناك وظيفة أو استدعاء نظام التشغيل لتزويدي باسم ملف مؤقت حتى أتمكن من البدء في الكتابة والقراءة منه؟

هل كانت مفيدة؟

المحلول

يمكنك استخدام ال mkstemp(3) وظيفة لهذا الغرض.البديل الآخر هو tmpfile(3) وظيفة.يعتمد أي منها تختاره على ما إذا كنت تريد فتح الملف كدفق ملفات مكتبة C (والذي tmpfile يفعل)، أو واصف الملف المباشر (mkstemp).ال tmpfile تقوم الوظيفة أيضًا بحذف الملف تلقائيًا عند انتهاء البرنامج.

تتمثل ميزة استخدام هذه الوظائف في أنها تتجنب حالات السباق بين تحديد اسم الملف الفريد وإنشاء الملف - بحيث لا يحاول برنامجان إنشاء نفس الملف في نفس الوقت، على سبيل المثال.

راجع صفحات الدليل لكلا الوظيفتين لمزيد من التفاصيل.

نصائح أخرى

السؤال هو كيفية إنشاء ملف مؤقت اسم.لا يقوم mkstemp أو tmpfile بتزويد المتصل باسم، بل يقومان بإرجاع واصف الملف أو مقبض الملف، على التوالي.

@غاريثم:

أعتقد أن الوظيفة التي تبحث عنها تسمى tmpnam.

يجب عليك بالتأكيد لا يستخدم tmpnam.يعاني من مشكلة حالة السباق التي ذكرتها في إجابتي:وبين تحديد الاسم وفتحه، قد يقوم برنامج آخر بإنشاء الملف أو رابط رمزي له، وهو ما يمثل ثغرة أمنية كبيرة.

ال tmpnam تقول صفحة الرجل على وجه التحديد عدم استخدامها، ولكن للاستخدام mkstemp أو tmpfile بدلاً من.

قطعاً:man mkstemp.

تحتوي صفحة الرجل على مثال للاستخدام.

لست متأكدًا من أي شيء في C lib، ولكن يمكنك القيام بذلك في Shell باستخدام com.mktemp.

يجب عليك استخدام mkstemp() لأن هذه هي الوظيفة الموصى بها، ولكنها تقوم بإرجاع واصف الملف، لذلك بمجرد حصولك على الواصف احصل على اسمه:

int fd;
fd = mkstemp("hdrXXXXXX);
/* Read out the link to our file descriptor. */
sprintf(path, "/proc/self/fd/%d", fd);
memset(result, 0, sizeof(result));
readlink(path, result, sizeof(result)-1);

/* Print the result. */
printf("%s\n", result);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top