Twoje pytanie wymagało leśnej odpowiedzi, a odpowiedzi tutaj wydają się podobne do drzew, więc pomyślałem, że dam ci leśną odpowiedź.
Bardzo rzadko pisane są programy C. Zawsze tak pisane są skrypty powłoki, a czasem pisane są programy Python, Perl lub Ruby.
Ludzie zwykle piszą w języku C, aby ułatwić korzystanie z bibliotek systemowych i bezpośredni dostęp do wywołań systemowych na niskim poziomie, a także szybkość. Język C jest trudny do napisania, więc jeśli ludzie nie potrzebują tych rzeczy, wówczas nie używają języka C. Oczekuje się również, że programy w języku C będą zależały tylko od bibliotek współdzielonych i plików konfiguracyjnych.
Ucieczka do podprocesu nie jest szczególnie szybka i nie wymaga drobnoziarnistego i kontrolowanego dostępu do obiektów systemowych niskiego poziomu, i wprowadza potencjalnie zaskakującą zależność od zewnętrznego pliku wykonywalnego, więc nie jest rzadkością w programach C.
Istnieją pewne dodatkowe obawy. Bezpieczeństwo i przenośność dotyczą osób, które wspominają, są całkowicie ważne. Oczywiście są one równie ważne dla skryptów powłoki, ale ludzie oczekują tego rodzaju problemów w skryptach powłoki. Jednak zwykle nie oczekuje się, że programy typu C będą miały tę klasę bezpieczeństwa, co czyni je bardziej niebezpiecznymi.
Ale moim zdaniem największe obawy dotyczą sposobu popen
interakcji z resztą twojego programu. popen
musi utworzyć proces potomny, odczytać jego dane wyjściowe i zebrać status wyjścia. W międzyczasie stderr tego procesu zostanie podłączony do tego samego stderr co twój program, co może powodować mylące wyjście, a jego stdin będzie taki sam jak twój program, co może powodować inne interesujące problemy. Możesz rozwiązać ten problem, dołączając </dev/null 2>/dev/null
ciąg, który przekazujesz, popen
ponieważ jest on interpretowany przez powłokę.
I popen
tworzy proces potomny. Jeśli zrobisz coś z obsługą sygnałów lub rozwidlaniem procesów, możesz otrzymać dziwne SIGCHLD
sygnały. Twoje wezwania do wait
mogą dziwnie współdziałać popen
i stwarzać dziwne warunki wyścigowe.
Istnieją oczywiście obawy dotyczące bezpieczeństwa i przenośności. Tak jak w przypadku skryptów powłoki lub czegokolwiek, co uruchamia inne pliki wykonywalne w systemie. I musisz uważać, aby ludzie używający twojego programu nie byli w stanie wprowadzić meta-znaków w powłoce do łańcucha, który przekazujesz, popen
ponieważ ten łańcuch jest przekazywany bezpośrednio za sh
pomocą sh -c <string from popen as a single argument>
.
Ale nie sądzę, że są, dlaczego to jest dziwne, aby zobaczyć program C przy użyciu popen
. To dziwne, ponieważ C jest zwykle językiem niskiego poziomu, a popen
nie niskim poziomem. A ponieważ użycie popen
ograniczeń projektowych ogranicza Twój program, ponieważ dziwnie współdziała ze standardowym wejściem i wyjściem Twojego programu i utrudnia zarządzanie procesami lub obsługę sygnałów. A ponieważ zwykle nie oczekuje się, że programy C będą miały zależności od zewnętrznych plików wykonywalnych.