• 締切済み

サーバプログラム

C言語の初心者です。 OS : CentOS 5.3 c言語でサーバ用のプログラムを書きました。 ソケット通信で接続してきたクライアントにデータをそのまま返すと言うものです。 コンパイルしたソースが、 gcc -Wall -o example example.c だとすると、この exampleソースを サービスとして( 「デーモンとして」と言うのか? )、起動したい場合、 どのように起動すればよいのでしょうか? ./example と叩くだけだと、叩いた間だけしかプログラムは動いてくれませんよねぇ。 また、サーバプログラムの良書を教えていただけたら幸いです。 初歩的な事でしたら申し訳ないですが、 よろしくお願いします。

みんなの回答

  • dev_null
  • ベストアンサー率67% (37/55)
回答No.3

> どちらが仕事として運用する方法として、正しいのでしょうか? 業務で使用するなら「コマンドを..」という方法だった場合、 及第点はあげられません。 コマンドを直接起動して問題が発生する可能性も考えられますし、 複数の接続先から同時にアクセスがあった場合などを考えても、 拡張性が劣ることが理由です。 自分は、下記の書籍を枕の下に置いてました。 「UNIXネットワークプログラミング」 「詳解TCP / IP」

brosis
質問者

お礼

再びありがとうございます。 >コマンドを直接起動して問題が発生する可能性も考えられますし、 >複数の接続先から同時にアクセスがあった場合などを考えても、 >拡張性が劣ることが理由です。 難しいですねぇ。具体的にどんな問題なのか、想像できません。 ご紹介頂いた本を理解すれば、想像がつくのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • dev_null
  • ベストアンサー率67% (37/55)
回答No.2

brosis様のとった方法は、solaris9様の参考サイトにある 「コマンドをデーモンプロセスのように動作させる」という方法になります。 デーモンプロセスとは、「デーモンプロセスプログラミング」のような手順 を踏んだプログラムを差すのではないでしょうか。 コマンドをデーモンとして動かすのなら nohup コマンドも参照してください。

brosis
質問者

お礼

dev_null様 ご回答ありがとうございます。 「コマンドをデーモンプロセスのように動作させる」という方法 と「デーモンプロセスプログラミング」のような手順を踏んだプログラム。 あまりはっきり意味を理解できていないのですが、 どちらが仕事として運用する方法として、正しいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • solaris9
  • ベストアンサー率66% (6/9)
回答No.1

以下のサイトが参考になると思います。 http://www7a.biglobe.ne.jp/~tsuneoka/daemon/ http://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)

brosis
質問者

お礼

早速のご回答ありがとうございます。 私の方で、下記のサイトを見つけ 一応プログラムを常駐させることができました。が、 solaris9さんが教えてくれたサイト http://www7a.biglobe.ne.jp/~tsuneoka/daemon/ と、私の見つけたサイトのやっていることは同じ事なんでしょうか? すみません、初心者すぎて。

brosis
質問者

補足

すみません。 「下記のサイト」とは↓です。 http://7ujm.net/linux/daemon.html また、シグナルに関してですが。 solaris9さんが教えてくれたサイトには、 シグナル 「SIGCHLDをSIG_IGNとするだけで対処できます」とありますが、 実際、私のソースにも↓の init_signal()関数の中で、↓ int main( void ) {     struct sockaddr_in sin;     /* サーバソケットの初期化 */     listen_fd = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP );     if( listen_fd < 0 )     {         fprintf( stderr, "Failed to create Server socket.\n" );         exit( EXIT_FAILURE );     }     memset( &sin, 0, sizeof( sin ) );     sin.sin_family = AF_INET;     sin.sin_addr.s_addr = INADDR_ANY;     sin.sin_port = htons( 7777 );     if( bind( listen_fd, (struct sockaddr *)&sin, sizeof( sin ) ) < 0 )     {         fprintf( stderr, "Failed to bind Server socket.\n" );         goto error;     }     if( listen( listen_fd, SOMAXCONN ) < 0 )     {         fprintf( stderr, "Failed to listen Client socket.\n" );         goto error;     }     printf( "Server listening port %d...\n", 7777 );     /* シグナル処理関数の初期化 関数 */     init_signal();     /* クライアントのアクセス待ち 関数 */     access_loop(); error:     close( listen_fd );     exit( EXIT_SUCCESS ); } void init_signal( void ) {     signal( SIGINT, close_server_fd );     signal( SIGTERM, close_server_fd );     signal( SIGCHLD, wait_child ); /* 子プロセス終了時→wait_child */     return; } というように SIGCHLD を書いていますが。 fork()をするのは、↑のmain関数後半のaccess_loop()関数内です。 クライアントからの接続要求あったことを確認した後です。 solaris9さんが教えてくれたサイトにある、 リスト4 初期化処理の例 で書かれている、     /* 不要なシグナルを禁止する */     signal(SIGALRM, SIG_IGN);     signal(SIGCHLD, SIG_IGN); /* ゾンビ止め */     signal(SIGHUP , SIG_IGN);     signal(SIGPIPE, SIG_IGN);     signal(SIGTERM, SIG_IGN); とは役割・意味合いが違うのでしょうか? 説明が分かりにくかったら申し訳ないです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Java(クライアント)とC言語(サーバ)間のソケット通信 サーバ再起動時のbindエラー

    サーバ側がC言語(Linux)、クライアント側がJavaのソケット通信プログラムを書いているのですが、いきなりつまづいてしまったため質問失礼します。 ソースとしては以下の2つのソースをテストとして利用させて頂きました。 ローカルネットワーク内の2台にそれぞれを設置し、それにあわせてIPとポートは変更してあります。 http://www.aihara.co.jp/~junt/program/socket/inet_server.c http://www.hellohiro.com/src/HelloWorldSocketClient.java サーバプログラムを少し変更し(http://oshiete1.goo.ne.jp/qa5565926.html)、サーバ起動→クライアント起動でサーバクライアント間通信を行えることを確認しました。 しかし、もう一度テストしてみようと直後にサーバプログラムを起動すると、bindでエラーを吐いてしまい接続待機状態にできませんでした。 少し待ってから起動したりポートを変えて実行すると正常に待機状態にできるため、プログラム終了時のソケットのクロージングが正常に行われずポートの競合が起きていることが原因だとは思うのですが、ソケットのcloseはサーバもクライアントも書いてあるため自分には解決方法が思いつきませんでした。 ちなみに、サーバプログラムのソースと併せて公開されているC言語クライアントプログラムを用いた場合は再起動してもbindエラーが出ることはありませんでした。 この問題の原因と考えられることと解決案をアドバイス願えませんでしょうか。よろしくお願いします。 以下、開発環境です。 ■C言語 OS:Fedora 12 エディタ:一応VisualC++2008(Linux用に書いているので実質ただのテキストエディタ) コンパイラ:標準gcc ■Java OS:Windows XP SP3 エディタ・コンパイラ:eclipse ※実装先の都合上、winsockによるサーバに変えるや言語の変更はできません。

  • gccコンパイラー

    今、gccでコンパイルするc言語のコンパイラーを探しています。 フリーでダウンロードできるいいコンパイラーはないでしょうか。 お勧めなどがありましたら教えてほしいです。 あと、C言語ではgccやbcc等のコンパイラーで プログラムソースの書き方容が変わったりするものなのでしょうか? 一応、ボーランド?のコンパイラーは持ってます。 ただ、今度OJTでUNIX環境のc言語開発の現場に行く事になり gccでコンパイルするもので勉強しとくようにいわれています。 宜しくお願いします。

  • zshrcのfunctionの作り方

    C言語のコンパイルの際、 gcc -Wall -o xxx xxx.c と入力する手間を省きたいので、rcファイルに function gcc () { gcc -Wall -o "$1%.c" "$1" } としているのですが、 gcc xxx.c を実行するとターミナルが落ちてしまいます。 何がいけないのでしょうか。 %.c は、 .cを除く目的で使っています。

  • Linux+GCCで、ソケットプログラム

    お世話になっております。 Linux<-->Win間で、データ送受信するプログラムを作りたいと思っています。 現在は、Win<-->Win間でWinSockを使ったプログラムがほぼ完成していますが、次の方向性としてLinux<-->Win間ソケットプログラムなのです。将来的には、組み込みPCとしてつかいたいのです。 DOSの頃(8年前くらい)にC言語はやっていたので、C言語は多少は覚えていますが、Linuxを使った事が無い、GCCの経験が無いので、OSの選択やGCC(特にソケット)に関する勉強をしなければなりません。 そこで、こういったジャンルを勉強できる本を探しているのですが、皆さんのお勧めは無いでしょうか?

  • サーバープログラム

    C言語でサーバープログラムを作ろうと思っているのですが まだ、一行も書いてない(書けないですが) 構造がよくわからないのです。 例えばWebサーバで言うと Apacheなどが有名ですが、HTTPプロトコル(正確にはHTTプロトコルですが)で、 データを5回にわけて送信するとき Cをクライアント、Sをサーバとすると C >>> S リクエスト S >>> C データ1 ... S >>> C データ5 ですが、途中で他のクライアントが来た場合 C1 >>> S リクエスト S >>> C1 データ1 S >>> C1 データ2 C2 >>> S リクエスト S >>> C1 データ3 S >>> C2 データ1 S >>> C1 ...データ5 S >>> C2 ...データ5 とこのように交互に送信されるのでしょうか? それともデータ送信中のリクエストは後回しにして C1へ全部送りきってからC2へ送るのでしょうか? わかりにくくてすみません。

  • Macのターミナル

    今学校でC言語を学んでいるものです。 今「sample.c」というファイルがあり、これをコンパイルしたいのですが、 学校(Linux)のターミナルでコンパイルするように 「% gcc -Wall -o sample sample.c」 と入力しても 「-bash: gcc: command not found」 と言われてしまいます。 どうしてでしょう? わかるかたがいたら教えてください。

    • ベストアンサー
    • Mac
  • C++プログラムをCで呼び出したい

    こんにちは。質問させていただきます。 現在、Linux/GCC3.2.3系でC言語の開発をしています。 私自身のレベルとしては、C言語での実務は1年未満。C++はゼロ。本業はJavaプログラマを数年やっております。 さっそく本題です。 既にC++で作成されたある一連のプログラム群(20本程度)があり、これらC++の関数をC言語で作成されたプログラムから呼び出して使用したいと思っています。 C++プログラムは既にテスト済みなので、これらのソースは基本的には手を加えず、そのままライブラリ化などして使用したいと考えています。 そこで質問なのですが、C言語から呼び出せるような形式でC++ソースをライブラリ化する方法と、C言語からの呼び出し方を教えていただけないでしょうか?

  • コンパイルされたCGI(C言語)を別サーバで動かす

    C言語にて簡単なCGIを作成しました。 gcc -o xxx.cgi xxx.c コンパイルをするとそのサーバでは問題なく動きます。 コンパイルしたCGIファイルを同じ環境の別サーバに 持っていくとInternalServerErrorとなり実行できません。 パーミッションもディレクトリ構造もApacheの設定も サーバ名、IPアドレスを除いて同じ設定です。 これは動作させるサーバ毎にコンパイルする必要が あるものなのでしょうか?もしサーバ毎にコンパイルする 必要があるのであればそれはどうしてなのでしょうか? もしくはなにか間違っているのでしょうか? お手数ですが、お分かりになる方、お教えください。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • gcc バージョン違いによるコンパイルエラー

    C言語でWeb系のプログラムを作成している者です。 以前まで、OSはFreeBSD 4.11-RELEASE-p12・gccのバージョンは2.95.4でコンパイルできていたプログラムが、OSはFreeBSD 5.4-RELEASE-p8・gccのバージョンは・gccのバージョンは 3.4.2で、今まで出なかったようなエラーが沢山出現し、コンパイルできなくなってしまいました。 OSをインストールし直すのは、既に稼働中のサイトですので厳しく、GCCのバージョンを下げるかソースを書き換えるかして対処する方向で行きたいと考えております。 しかし、gccの2.95.4の圧縮ファイルはもう、gccの公式サイトに落ちておらず、バージョンダウンは難しそうです。 gccのバージョンによるコンパイルエラーを乗り越えた方、ご指摘など有りましたらお教えくださると幸いです。

  • アプレットからサーバ側のプログラムを起動したいのですが…

    仕事でJavaを使うことになったのですが、プロジェクト員一同Java初心者で、必死にJavaを勉強していますが、以下のことで困っています。申し訳ありません。助けてください。 UNIXサーバ側の設定とかをいじるプログラムがあるのですが、それをアプレットにして、SEさんがリモートからでも操作出来るようにしろ、と言われました。 とりあえず、Javaアプレットからサーバ側(アプレットのクラスが置いてあるのと同じマシン)のCプログラムを起動し、その結果を受け取るようにしたいのですが、Java経験者に相談したら「アプレットにはセキュリティ上の問題があるのでCGIかServletを使わないと出来ない」と言われました。 では…とServletの勉強を初め、サーバー側にServletEngineをいれてみたのですが、 ServletはHTTPポートと違うポート(8000番とか)を開けてそこにアクセスしなくてはいけないようにみえます。それならクライアント側プログラムをアプレットにし、サーバ側プログラムとSocket通信で結び、サーバ側プログラムがCプログラムを起動、としたほうが楽そうですが、ひとつしかポートを開きたくないと言われたのです。 もしかして「アプレット+Servlet が アプレット+CGI相当」じゃなく「Servlet が アプレット+CGI相当」なのでServlet用のポートだけ開けとけばいいとかいうことでしょうか?  とか思っていたら、JNIでC言語のメソッドをJavaメソッド扱いするとかいう話も小耳に挟みました。それでできるのかしら? ・webポートだけを開いて ・サーバ側のCプログラムを起動してその結果を受け取る ・クライアントのマシンにあらかじめインストールしなくても、ブラウザからアクセスすると操作が対話的に出来るような ものを簡単に作ろうとしたら、一体何を勉強するべきなのでしょうか…。 Applet+CGI? Applet+Servlet? RMI? JNI…? 助けてください…(TT)

    • ベストアンサー
    • Java
このQ&Aのポイント
  • モテない男性が女性の寛容さを求めています。自己犠牲をしていることや外見やコミュニケーションの努力をしていることを述べています。
  • 男性は女性に比べて選ばれる側であると述べており、女性側がもう少し寛容になってほしいと願っています。
  • 男性は自分磨きをした上でモテない現実に疲れていると述べており、女性に対する悲しみと悔しさを感じています。
回答を見る