2010-07-01 22 views
7

Nó được đề cập trong ftok() thủ côngNhững tập tin tôi phải vượt qua như là đối số tên đường dẫn của ftok()

key_t ftok(const char *pathname, int proj_id); 

Các ftok() chức năng sử dụng danh tính của các tập tin được đặt tên bởi các tên đường dẫn cho (mà phải tham khảo tệp hiện có, có thể truy cập) ...

Tôi đang bối rối về const char *pathname.

Phương pháp hay nhất cho nó là gì? Trên hệ thống hiện tại của tôi, tôi có thể vượt qua "/home/Andrew/anyfile" nhưng không thể các hệ thống khác mà chương trình của tôi phải làm việc sẽ có tệp này.

Tôi sử dụng "/etc/hosts/" hoặc "/etc/inittab" vì tôi chắc chắn rằng tất cả các hệ thống như vậy sẽ có hai tệp này? Nó là một ý tưởng tốt? Nó có thể gây ra vấn đề gì không?

Tôi không muốn yêu cầu người dùng nhập tên tệp tại thời điểm thực thi hoặc chuyển tên tệp dưới dạng đối số dòng lệnh.

Có cách nào khác và tốt hơn để quyết định pathname không?
Cách nào là tốt nhất và đáng tin cậy nhất?

Cảm ơn thời gian của bạn.

+0

Cách tốt hơn cho những gì? Đáng tin cậy cho những gì? - Có lẽ nó tốt hơn để mô tả một nhiệm vụ mà ftok được cho là sẽ được sử dụng? – pmod

+0

@Pmod: Thực ra, tôi cần một hàng đợi để hai chương trình của tôi có thể giao tiếp với nhau. Điều thực sự làm tôi bối rối là tập tin nào tôi nên chuyển tới ftok() sẽ luôn có mặt. [Câu trả lời này] (http://stackoverflow.com/questions/3155291/which-file-should-i-pass-as-pathname-argument-of-ftok/3155312#3155312) nói rằng nó là ok để vượt qua ''/etc''. Nếu vậy thì tại sao mọi người vượt qua các tệp khác? Không phải là nó dễ dàng và tốt hơn để vượt qua một trong các tập tin hệ thống? –

+0

Khi chúng tôi có nhiệm vụ tương tự (được tổ chức thông tin liên lạc giữa hai chương trình trong linux với sự giúp đỡ của hàng đợi tin nhắn) - chúng tôi sử dụng tập tin. Chương trình đầu tiên (giống như máy chủ - luôn chạy) tạo tệp có id tin nhắn, sau đó chương trình thứ hai (chương trình người dùng) đọc id msg từ tệp đó và có quyền truy cập vào hàng đợi. – pmod

Trả lời

12

Vâng, thông thường, bạn sẽ sử dụng tệp được liên kết với chính ứng dụng. Ví dụ, chúng tôi đã có một ứng dụng đã tải một tệp cấu hình vào bộ nhớ chia sẻ (theo cách phân tích có hiệu quả được phân tích cú pháp - hãy nghĩ đến tệp XML đã được chuyển thành cấu trúc trong bộ nhớ với con trỏ nhanh và vv) và chúng tôi đã tạo phân đoạn bộ nhớ dùng chung từ số ftok bắt nguồn từ chính tệp cấu hình.

Trường hợp xấu nhất, nếu bạn không có tệp cấu hình cho ứng dụng của mình, hãy thử sử dụng chính tệp thực thi đó. Bạn có thể chắc chắn rằng nó tồn tại trên hệ thống ở đâu đó (vì bạn đang chạy nó).

Bạn cũng không bị giới hạn tệp, bạn có thể sử dụng /etc chính nó hoặc /tmp hoặc thậm chí / nếu bạn phải.

Tôi nói "nếu bạn phải" vì nó hơi nguy hiểm một chút. Cuộc gọi ftok sẽ cung cấp cho bạn khóa duy nhất dựa trên thông số tệp và ID của bạn. Nếu bạn sử dụng tệp riêng của mình chẳng hạn như /etc/andrew.conf, bạn có thể chắc chắn một cách hợp lý rằng bạn sẽ không gặp xung đột với bất kỳ khóa nào khác là ftok.

Tuy nhiên, nếu bạn và mọi người khác, hãy quyết định sử dụng /tmp làm phần thông tin tệp thì chỉ khác biệt là ID. Do đó nó dễ dàng hơn nhiều để có được một va chạm với các phím khác.

Điều tôi luôn làm là sử dụng thông số tệp làm giá trị thực sự duy nhất cho ứng dụng của tôi và sau đó chỉ sử dụng ID cho điều cụ thể mà tôi muốn tạo.

Vì vậy, nếu tôi cần 27 Cột và 15 khối bộ nhớ chia sẻ, họ tất cả sử dụng /etc/pax.conf như file spec và các ID 1-42 (và ứng dụng của tôi biết gì ID liên quan đến những gì đối tượng).

+0

"bạn có thể sử dụng' '/ etc'' chính nó hoặc' '/ tmp'' hoặc thậm chí' '/' 'nếu bạn phải." nó là một ý tưởng tồi? Nếu nó được cho phép hơn lý do tại sao bạn không sử dụng nó trong ứng dụng của bạn? Điều này khiến tôi khó hiểu. Khi chúng ta có thể sử dụng ''/etc/hosts'' hoặc bất kỳ tệp hệ thống nào luôn luôn hiện diện, tại sao chúng ta phải tìm các cách khác? Vui lòng giải thích. Cảm ơn –

+1

@andrew: Xem cập nhật. – paxdiablo

+0

+1 Cảm ơn paxdiablo –

1

Bạn có thể chủ động xây dựng một char * cho một con đường dựa trên một tập tin cấu hình, hoặc một tham số dòng lệnh vv

Chỉ cần vượt qua mà char * vào hàm.

2

Có lẽ tốt nhất là sử dụng argv [0] của một trong các tệp thi hành của bạn. Trang người đàn ông nói

The resulting value is the same for all pathnames that name the same file, ... 

vì vậy bạn nên an toàn, ngay cả khi đôi khi bạn thực thi được gọi thông qua liên kết tượng trưng.

+0

Chắc chắn! Nhưng sau đó làm thế nào chương trình khác sẽ biết về nó? Pathname và proj_id phải giống nhau trong cả hai chương trình để ftok() tạo ra cùng một khóa. Một trong số họ sử dụng argv [0] vì vậy làm thế nào khác sẽ biết về nó? Vui lòng xây dựng. –

+0

Ý tưởng về ftok là hai chương trình chia sẻ kiến ​​thức chung. Tôi sẽ giả sử rằng họ biết tên thực thi của nhau. Sau đó, bạn có thêm khóa giúp phân biệt một số phiên của cùng một ứng dụng. Trong mọi trường hợp, bạn phải chia sẻ kiến ​​thức phổ biến đó về khởi động, ví dụ như với biến môi trường. –

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