Giả sử tôi đang tạo một chương trình trong C cần sử dụng tempfile. Việc tạo một tệp tempfile đặc biệt trong/tmp có lẽ không phải là một ý tưởng hay. Có một chức năng hoặc hệ điều hành gọi để cung cấp cho tôi một tên tempfile để tôi có thể bắt đầu viết và đọc từ nó?Làm thế nào để bạn lấy tên tệp của tempfile để sử dụng trong Linux?
Trả lời
Bạn có thể sử dụng chức năng mkstemp(3)
cho mục đích này. Một lựa chọn khác là hàm tmpfile(3)
. Điều nào bạn chọn phụ thuộc vào việc bạn muốn mở tệp dưới dạng luồng tệp thư viện C (trong đó tmpfile
không) hoặc mô tả tệp trực tiếp (mkstemp
). Chức năng tmpfile
cũng tự động xóa tệp khi bạn hoàn thành chương trình.
Lợi thế của việc sử dụng các chức năng này là chúng tránh điều kiện cuộc đua giữa việc xác định tên tệp duy nhất và tạo tệp - do đó hai chương trình sẽ không cố gắng tạo cùng một tệp cùng một lúc.
Xem trang hướng dẫn sử dụng cho cả hai chức năng để biết thêm chi tiết.
Tuyệt đối: người đàn ông mkstemp.
Trang hướng dẫn sử dụng ví dụ.
Không chắc chắn về bất cứ điều gì trong một lib C, nhưng bạn có thể làm điều này tại vỏ với mktemp.
@garethm:
Tôi tin rằng các chức năng bạn đang tìm kiếm được gọi là tmpnam.
Bạn chắc chắn nên không sử dụng tmpnam
. Nó gặp vấn đề về điều kiện chủng tộc tôi đã đề cập trong câu trả lời của tôi: Giữa việc xác định tên và mở nó, một chương trình khác có thể tạo tệp hoặc liên kết tượng trưng với nó, một lỗ hổng bảo mật rất lớn.
Trang tmpnam
cụ thể không được sử dụng, nhưng thay vào đó hãy sử dụng mkstemp
hoặc tmpfile
.
Câu hỏi đặt ra là cách tạo tệp tạm thời tên. Cả mkstemp lẫn tmpfile đều không cung cấp tên người gọi, chúng trả về một bộ mô tả tập tin hoặc tập tin xử lý tương ứng.
Bạn đúng, Mark, câu hỏi yêu cầu tên tệp tạm thời. Nhưng câu hỏi là sai. Người hỏi không thực sự muốn một tên tập tin tạm thời, anh ta thực sự muốn một tập tin tạm thời. –
Sau đó, câu hỏi phải được thay đổi. –
Không đúng: mkstemp * có * cung cấp cho người gọi tên, vì nó sửa đổi mẫu nó được cung cấp. Người gọi cần cung cấp mẫu, nhưng đây là vấn đề tương đối đơn giản khi chọn thư mục tạm thời (ví dụ: $ TMPDIR, P_tmpdir hoặc "/ tmp") và tiền tố, tiếp theo là sáu X. –
Bạn nên sử dụng mkstemp() vì đây là chức năng khuyến cáo, nhưng nó trả về một bộ mô tả tập tin, vì vậy một khi bạn có mô tả được tên của nó:
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);
Vui lòng chekc [URL] này (http://stackoverflow.com/help) sẽ hữu ích để nâng cao chất lượng nội dung của bạn –
- 1. Làm thế nào để sử dụng tempfile của Python.NamedTemporaryFile()?
- 2. Làm cách nào để lấy tên chủ sở hữu của tệp trong Linux bằng C++?
- 3. Làm cách nào để lấy các PID đang sử dụng tên tệp đã cho trong C#?
- 4. Làm cách nào để hiển thị tên tệp của tệp bạn đang làm việc trong vim?
- 5. Làm cách nào để sử dụng con trỏ ITypeInfo để lấy tên của loại?
- 6. Làm thế nào để bạn sử dụng Ruby trong Java?
- 7. Làm cách nào để lấy tên của tệp được tạo bằng luồng trong C#?
- 8. Làm cách nào để liệt kê một tên tệp trên mỗi dòng đầu ra trong Linux?
- 9. Làm thế nào để bạn tổ chức các cffunctions tái sử dụng nhỏ của bạn?
- 10. Làm cách nào để lấy tên của chủ sở hữu tệp trong Java trên OSX?
- 11. Làm thế nào để sử dụng LuaInterface trên Mono/Linux
- 12. Làm thế nào để bạn sử dụng SymLoadModuleEx để tải một tệp PDB?
- 13. Làm thế nào để sử dụng dòng lệnh ftp linux với một dấu @ trong tên người dùng của tôi?
- 14. Làm thế nào để bạn lấy tên đơn vị mới từ các công cụ mở của Delphi API
- 15. Làm thế nào để bạn sử dụng memcache với PHP
- 16. Làm thế nào để sử dụng inotify?
- 17. Làm thế nào để bạn nhập một tệp trong python có dấu cách trong tên?
- 18. Làm cách nào để lấy tên của hằng số?
- 19. Làm thế nào để bạn đối phó với nhiều tệp mở cùng tên trong VisualStudio?
- 20. Chỉ cần làm thế nào để bạn sử dụng TTStyledTextLabel?
- 21. Làm thế nào để bạn sử dụng i18n với Node.js?
- 22. Làm thế nào để bạn xử lý tên mã quốc gia TLD trong gói/không gian tên của bạn?
- 23. Làm thế nào để bạn sử dụng jQuery (elementArray)?
- 24. Làm thế nào để lấy tên của một data.frame trong một danh sách?
- 25. Sử dụng Powershell làm thế nào để bạn nhận được số ngày trong tuần?
- 26. Làm cách nào để lấy tên tệp gốc của ảnh trong iOS?
- 27. Làm thế nào để bạn sử dụng sed từ Perl?
- 28. Làm thế nào để bạn sử dụng một loại bên ngoài không gian tên riêng của nó trong clojure?
- 29. Làm thế nào để bạn sử dụng một biểu tượng @ trong tên của một đối tượng PHP
- 30. Làm thế nào để bạn làm cho bộ nhớ ứng dụng Java của bạn hiệu quả?
mkstemp chỉ trả về một bộ mô tả tập tin mở trên tệp mới nhưng bạn cũng có thể lấy tên cuối cùng vì mkstemp thay thế các ký tự XXXXXX của mẫu. – Angel