제목에서 알 수 있듯이 bash 스크립트에서 실행될 때 C++ 프로그램에 신호, 경고, 메시지 등을 보낼 수 있기를 원합니다. 스크립트가 매개 변수를 사용하여 프로그램을 시작하는 몇 가지 솔루션을 보았지만 프로그램이 이미 실행 중일 때 발생해야 합니다. 이를 수행할 수 있는 방법이 있습니까? 기본적으로 스크립트가 백그라운드에서 실행되는 동안 오류가 발생하면 OS 어딘가에 기록되지 않고 프로그램에 직접 보고되기를 원합니다. 저는 레드햇 8을 사용하고 있습니다.
감사해요
답변1
신호 보내기:
kill -s signal -- pid_of_your_app
signal - 보낼 신호입니다. 이름이나 번호로 지정할 수 있습니다.
데이터 보내기:
echo "text_message" | your_app
또는
cat file | your_app
| - 명령의 표준 출력을 프로그램의 표준 입력으로 보내는 파이프입니다.
고쳐 쓰다:
신호 처리와 관련하여 기본적으로 종료되기 때문에 응용 프로그램에서 신호를 처리해야 합니다. (kill(9)을 제외한 모든 신호에 대해 핸들러를 할당할 수 있습니다.) https://en.cppreference.com/w/cpp/utility/program/signal
#include <csignal>
void signal_handler(int signal);
// Install a signal handler
std::signal(SIGINT, signal_handler);
답변2
시작 시 잘 알려진 경로 이름을 사용하여 fifo(명명된 파이프)를 생성하고 종료 시 fifo를 삭제하도록 수신기를 조정할 수 있습니다. 일반적으로 수신자가 쓰기를 위해 동일한 fifo를 열도록 하여 이를 열어 둡니다. 작성기가 없는 파이프는 판독기에 EOF를 알리는 경향이 있습니다.
데이터가 없을 때 기다리지 않고도 FIFO의 데이터를 주기적으로 폴링할 수 있습니다. 저는 C++를 하지 않지만 C에서는 fifo O_NONBLOCK을 표시하기만 하면 됩니다. C++에는 비슷한 메커니즘이 있습니다.
그런 다음 다른 프로세스에서는 fifo가 존재하는지 확인하고(활성 리더가 있음을 알 수 있음) 수신자가 이해할 수 있는 텍스트를 보낼 수 있습니다.
차단보다 스레딩을 선호하는 경우 차단 FIFO를 읽고 이를 스레딩 메커니즘 내에서 동기화하는 별도의 스레드를 가질 수 있습니다.
신호의 한 가지 문제점은 수신자의 pid를 식별해야 한다는 것입니다. fifo를 사용하면 안정적인 이름 지정 방법이 제공됩니다.
편집: 신뢰할 수 있는 시작 및 종료 조건을 사용하여 명명된 파이프를 통해 클라이언트 수에 관계없이 서버에 메시지를 보낼 수 있는 솔루션의 프로토타입을 만듭니다. 단점은 Bash에 있다는 것입니다. 클라이언트용 40줄, 서버용 65줄입니다.