2008-08-27 27 views

Trả lời

20

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.

+0

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

2

Tuyệt đối: người đàn ông mkstemp.

Trang hướng dẫn sử dụng ví dụ.

1

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.

3

@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.

5

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.

+0

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. –

+1

Sau đó, câu hỏi phải được thay đổi. –

+10

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. –

0

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); 
+0

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 –

Các vấn đề liên quan