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 popeninterakcji z resztą twojego programu. popenmusi 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/nullciąg, który przekazujesz, popenponieważ jest on interpretowany przez powłokę.
I popentworzy proces potomny. Jeśli zrobisz coś z obsługą sygnałów lub rozwidlaniem procesów, możesz otrzymać dziwne SIGCHLDsygnały. Twoje wezwania do waitmogą dziwnie współdziałać popeni 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, popenponieważ ten łańcuch jest przekazywany bezpośrednio za shpomocą 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 popennie niskim poziomem. A ponieważ użycie popenograniczeń 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.