W mojej aplikacji C++ moja aplikacja wykonuje execv()
w procesie potomnym, aby użyć tego samego pliku wykonywalnego do przetworzenia pracy w nowym procesie potomnym z różnymi argumentami, które komunikują się z rurami z procesem nadrzędnym. Aby uzyskać ścieżkę do siebie, ja wykonać następujący kod na porcie Linux (mam inny kod na komputerze Macintosh):Jak radzić sobie z readlink() z "/ proc/self/exe", gdy plik wykonywalny jest zastępowany podczas wykonywania?
const size_t bufSize = PATH_MAX + 1;
char dirNameBuffer[bufSize];
// Read the symbolic link '/proc/self/exe'.
const char *linkName = "/proc/self/exe";
const int ret = int(readlink(linkName, dirNameBuffer, bufSize - 1));
Jednakże, jeśli natomiast wykonywalny jest uruchomiony, wymienić wykonywalny z zaktualizowanej wersji binarna na dysku, wynik readlink()
ciąg jest: "/usr/local/bin/myExecutable (deleted)"
rozumiem, że mój plik został zastąpiony przez nowszą zaktualizowaną wersję i oryginał do /proc/self/exe
jest teraz zastąpiony jednak, kiedy idę do execv()
teraz nie z errno
2 - No such file or directory.
ze względu na dodatkowe końcowe " (deleted)"
w wyniku.
Chciałbym, aby execv()
używał starego pliku wykonywalnego dla siebie lub zaktualizowanego. Mogłem po prostu wykryć ciąg kończący się na " (deleted)"
i zmodyfikować go, aby to pominąć i rozwiązać zaktualizowany plik wykonywalny, ale wydaje mi się to niezręczne.
Jak mogę execv()
bieżącego pliku wykonywalnego (lub jego wymiany, jeśli jest to łatwiejsze) z nowym zestawem argumentów, gdy oryginalny plik wykonywalny został zastąpiony przez zaktualizowany podczas wykonywania?
Dlaczego po prostu nie używać 'argv [0]', jak przekazano do 'main'? –
@ JonathonReinhart ponieważ argv [0] nie zawsze podaje ścieżkę do pliku wykonywalnego i może jedynie nazwać plik wykonywalny. – WilliamKF
Interesujący problem. Myślę, że przycięcie "(usuniętego)" byłoby tutaj najprostszym rozwiązaniem. –