こんにちは初心者のCプログラマから。サーバーの親プロセスが受け入れ呼び出しでスタックしました。子から親をきれいに終了させる方法
シンプルなサーバークライアントのセットアップがあります。私は1つのクライアントをサーバーに接続したいだけですが、私は他のクライアントがサーバーが占有されているというメッセージを受け取ることができます。
1つのクライアントでサーバーに接続でき、接続しようとしている他のクライアントに空きがないことを知らせることができます。私の問題は、クライアントがサーバーにシャットダウンを指示したときに発生します。子プロセスはループから抜け出し、終了することができます。しかし親は、accept
に固執しているので、パイプを使って子からメッセージを受け取ることができません。
私はkill(2)
を使用して親を終了することができますが、ソケットとファイルのクローズできれいに終了しますか?
私はまた、fcntl(sock_desc, F_SETFL, fcntl(sock_desc, F_GETFL, 0) | O_NONBLOCK);
を使用して受け入れ時に親が止まらないようにしようとしましたが、これにより新しい問題が発生します。
私はどういうわけか子供にaccept
行をスキップし、パイプメッセージを取得してループを終了するよう親に伝えさせたいと思っています。
これはサーバーを終了するための悪い方法である場合、私はそれについて学ぶために感謝します。
簡体サーバコード:
void termination_handler (int signum)
{
if(signum == SIGTERM){
//Is this where the accept call is changed?
}
}
void main(){
struct sigaction sa = {0}; //2b) Initialise the struct sigaction variable to all 0s beforehand.
sa.handler = termination_handler; //2a) Set the member for handler (to the signal-handler function)
sigaction(SIGTERM, &sa, NULL);
pid_t pid;
int loop = 1;
while(loop){
int sock = accept(net_sock, NULL, NULL); //After connection
//parent is stuck here
if(kill(pid,0) == -1){
pid = fork();
}
else{
//Tell second client there is no room and close socket
}
//Child
if(pid == 0){
while(loop){
//Read signal in from client to end child loop and terminate child
//Write with pipe to parent to end parent loop and terminate parent
kill(getppid(), SIGTERM) // Is this how I do it?
}
}
//Parent
else{
close(sock);
//Read with pipe from child to end loop
//After first connection, the parent won't get this message
}
}
関連:https://stackoverflow.com/a/23685817/694576 – alk
私は私の答えに 'sigaction'ケースのためのコードを追加しました。初期化されたローカルの 'pid_t pid;'で 'kill 'を呼び出すので、あなたのコードは未定義ではありません。とにかく、それ以上の質問があれば、おそらくそれを修正するのではなく、別のものにするべきです。 – PSkocik