2010-07-01 14 views
7

jest ona wymieniona w ftok() ręcznegoKtóry plik powinien przekazać jako argument Ścieżka ftok()

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

ftok() funkcja wykorzystuje tożsamość pliku o nazwie podanej ścieżki (który musi odwołaj się do istniejącego, dostępnego pliku) ...

Jestem zdezorientowany około const char *pathname.

Jaka byłaby najlepsza praktyka? W moim obecnym systemie mogę zdać "/home/Andrew/anyfile", ale nie jest możliwe, że inne systemy, na których mój program musi działać, będą miały ten plik.

Co powiesz na używanie "/etc/hosts/" lub "/etc/inittab", ponieważ jestem pewien, że wszystkie takie systemy będą miały te dwa pliki? Czy to dobry pomysł? Czy to może spowodować jakiś problem?

Nie chcę prosić użytkownika o podanie nazwy pliku w czasie wykonywania lub przekazać nazwę pliku jako argument wiersza poleceń.

Czy istnieje inny inny i lepszy sposób, aby zdecydować pathname?
Która droga jest najlepsza i najbardziej niezawodna?

Dzięki za poświęcony czas.

+0

Lepszy sposób na co? Niezawodny za co? - Może lepiej opisać zadanie, do którego ma zostać użyty ftok? – pmod

+0

@Pmod: Właściwie potrzebuję kolejki, aby moje dwa programy mogły się ze sobą komunikować. Rzeczą, która mnie zdezorientowała, jest to, który plik powinienem przekazać ftok(), który zawsze będzie obecny. [Ta odpowiedź] (http://stackoverflow.com/questions/3155291/which-file-should-i-pass-as-pathname-argument-of-ftok/3155312#3155312) mówi, że dobrze jest przekazać ''/etc ". Jeśli tak, to dlaczego ludzie przekazują inne pliki? Czy nie jest łatwo i lepiej przekazać jeden z plików systemowych? –

+0

Kiedy mieliśmy podobne zadanie (zorganizowana komunikacja między dwoma programami w Linuksie za pomocą kolejki komunikatów) - użyliśmy pliku. Pierwszy program (który jest jak serwer - zawsze działa) tworzy plik z komunikatem id, następnie drugi (program użytkownika) odczytuje identyfikator msg z tego pliku i ma dostęp do kolejki. – pmod

Odpowiedz

12

Zasadniczo można użyć pliku skojarzonego z samą aplikacją.

Na przykład, mieliśmy aplikację, która ładowała plik konfiguracyjny do pamięci współdzielonej (w parsowanym, wydajnie dostępnym sposobie - pomyśl o pliku XML, który został przekształcony w struktury pamięci z szybkimi wskaźnikami i tak dalej), a my utworzył segment pamięci współużytkowanej z ftok pochodzący z samego pliku konfiguracyjnego.

W najgorszym przypadku, jeśli nie masz plików konfiguracyjnych dla swojej aplikacji, spróbuj użyć samego pliku wykonywalnego. Możesz być prawie pewien, że istnieje on gdzieś w systemie (od kiedy go uruchamiasz).

Nie jesteś również ograniczony do plików, możesz sam użyć /etc lub /tmp lub nawet /, jeśli musisz.

Mówię "jeśli musisz", ponieważ jest to trochę niebezpieczne. Wywołanie ftok da ci unikatowy klucz oparty na specyfikacji pliku i twoim ID. Jeśli używasz własne pliku takie jak /etc/andrew.conf, można mieć pewność, iż nie będzie się starcia z jakimkolwiek innym ftok klucza -returned.

Jednakże, jeśli ty i wszyscy inni zdecydujesz się użyć /tmp jako części specyfikacji pliku, jedyną różnicą jest identyfikator. Stąd dużo łatwiej jest zderzyć się z innymi kluczami.

Co ja zawsze wykonane jest użycie spec plików jako prawdziwie unikalną wartość dla mojej aplikacji, a następnie po prostu użyć identyfikatora dla konkretnej rzeczy chcę stworzyć.

Więc jeśli muszę semaforów 27 i 15 dodanych bloków pamięci, oni wszystko użytku /etc/pax.conf jako spec plików i identyfikatory od 1 do 42 (i mój wniosek wie co odnosi się do tego, co ID obiektu).

+0

"możesz użyć samego' '/ etc'' lub' '/ tmp'' lub nawet' '/' 'jeśli musisz." Czy to zły pomysł? Jeśli jest to dozwolone, to dlaczego nie użyłeś go w swoim zgłoszeniu? To mnie myli. Kiedy możemy użyć ''/etc/hosts'' lub jakiegokolwiek innego pliku systemowego, który jest zawsze obecny, dlaczego musimy szukać innych sposobów? Proszę to wyjaśnić. Dzięki –

+1

@andrew: Zobacz aktualizację. – paxdiablo

+0

+1 Dzięki Paxdiablo –

1

Można dynamicznie zbudować char * na ścieżce w oparciu o plik konfiguracyjny lub linii komend parametrem itp

Wystarczy przekazać tę char * do funkcji.

2

Prawdopodobnie najlepsze jest użycie argv [0] jednego z plików wykonywalnych. Strona podręcznika mówi: , więc powinieneś być bezpieczny, nawet jeśli twój plik wykonywalny jest czasami wywoływany przez dowiązanie symboliczne.

+0

Pewnie! Ale jak inny program o tym wie? Ścieżka i proj_id powinny być takie same w obu programach, aby ftok() generował ten sam klucz. Jeden z nich używa argv [0], więc jak inni o tym wiedzą? Uprzejmy i dopracowany. –

+0

Idea ftok polega na tym, że oba programy mają wspólną wiedzę. Przypuszczam, że znają one nazwy plików wykonywalnych siebie nawzajem. Następnie masz dodatkowy klucz, który pomaga odróżnić kilka sesji tej samej aplikacji. W każdym przypadku musisz podzielić się tą powszechną wiedzą podczas uruchamiania, np. Ze zmienną środowiskową. –

Powiązane problemy