人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Debian上でsnmpdデーモンをC言語内でsystem関数をしようして起動しています。
同じく停止をsystem関数で行うとデーモンが停止しません。何が原因と考えられますでしょうか?
popenも使用してみましたが症状が変わりませんでした。
またKill -HUPも受付られないようです。。

下記のようなコードになっております。
system("/etc/snmp/snmpd start");
system("/etc/snmp/snmpd stop");

●質問者: root00
●カテゴリ:コンピュータ
✍キーワード:C言語 debian ETC SNMP コード
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● kurukuru-neko
●20ポイント

理由は、SIGNALを正しく親プロセスが制御

していないからです。

子プロセスが終了する処理にはsystem関数は

使えますが制御が完了しないものには

使うと不都合が発生します。又、SIGINT,SIGQUIT

は無効になります。


http://www.linux.or.jp/JM/html/LDP_man-pages/man3/system.3.html

非同期に動作するプログラムは、

fork/execv/signal等を制御する必要があります。

以下は適当に考えて処理です。

コンパイルもエラーチエックもいい加減

でですが。 使う関数はあっています。


pid_t t;

t=fork();

if( t==(pid_t)0 ) {

if( daemon(0,0)==0 ) {

signal(SIGHUP,SIG_DFL);

signal(SIGQUIT,SIG_DFL);

signal(SIGCLD,SIG_IGN);

execlp("/etc/snmp/snmpd","snmpd","start",NULL);

} else {

exit(1);

};

} else if( t != (pid_t)-1) {

int status = 0;

while( waitpid(t,&status,0) != (pid_t)-1) ) {

status = 0 ;

};

return( status );

} else {

return -1;

}

◎質問者からの返答

回答いただいた処理を実装したのでが症状が変わりませんでした。

コマンドライン上ではうまくいきますが

ものはライブラリになっておりそこからの実行ではうまくいきません。

又、system関数でも上記処理でもsnmpdはあがるのですがコマンドラインからの/etc/init.d/snmpd stopでは停止しなくなります。

/etc/init.d/snmpdはstart-sotpデーモンのシェルです。


2 ● toohigh
●18ポイント

一応確認ですが、下記のとおり、ですよね。

system("/etc/init.d/snmpd start");

system("/etc/init.d/snmpd stop");

普通に root 権限を持った状態で上記コマンドを実行した場合には、正しく起動・終了できているのでしょうか。snmpd.conf や /etc/default/snmpd あたりの設定に不備があるためにそもそもうまく停止できる状態にない、という感じがします。

あとは、root 権限を使わずに snmpd を起動しようとしている場合 (通常 snmpd は特権ポートである 161/udp を利用するので root 権限が必要)に、start は setuid その他の理由で成功するけど、stop や kill -HUP は特権がないために効かない、というパターンでしょうか。

具体的な設定内容など、もう少し詳しい情報があると、より的確な回答が得られるかもしれません。

http://www.google.co.jp/

◎質問者からの返答

root権限でコマンドラインからの実行では問題ありませんでした。snmpd.confの情報が誤っていても起動はできます。


3 ● b-wind
●18ポイント

http://q.hatena.ne.jp/1155479221

まずC言語プログラムを実行しているユーザーでログインし

コマンドラインから普通に実行してみましょう。

そこで動作しないようであれば、設定ミスか権限の不足の可能性が高いです。

そこで問題ないようでしたら、snmpd のログを確信すると何か情報が得られるかもしれません。

◎質問者からの返答

bash上でのコマンドラインからの入力では問題ありませんでした。


4 ● kurukuru-neko
●400ポイント ベストアンサー

一部間違いコンパイルはできました

多分動作できます。

main部分を書き変えて調べてみてください。

現在は、ls -lRa / を実行する

#include <stdio.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <stdlib.h>

#include <errno.h>

#include <fcntl.h>

int

run_daemon (const char *pfile, char *parg[])

{

pid_t t;

t = fork ();

if (t == (pid_t) 0) {

if( access(pfile,X_OK)!=0 ) {

exit(1);

};

if (daemon (0, 0) == 0) {

signal (SIGHUP, SIG_DFL);

signal (SIGQUIT, SIG_DFL);

signal (SIGCLD, SIG_IGN);

execvp (pfile, parg);

};

exit (1);

} else if (t != (pid_t) - 1) {

int status = 0;

while (waitpid (t, &status, 0) == (pid_t) - 1 ) {

status = 0;

};

return (status);

} else {

return -1;

}

}

int main(int argc,char *argv) {

char *args[10];

args[0] = "ls";

args[1] = "-Ra";

args[2] = "/";

args[3] = NULL;

printf("RC=%d\n",run_daemon("/bin/ls",args));

}

DUMMY : http://www.yahoo.co.jp


5 ● ksaito11
●18ポイント

/etc/init.d/snmpdでsnmpを起動した場合に起動したプロセスのPIDが/var/run/snmpd.pidに記録されませんか?(/var/runじゃないかも知れません... 外出先でDebianで確認することができないので...)

snmpd stopするときには、pidファイルに記録されたプロセスに対してシグナルを送るはずです。

root権限で起動しないとpidファイルが作成されずに起動してしまい、stopでKILLするプロセスが分からなくなっているのではないでしょうか。

いずれにしろ、手動で確認してエラーが出ていないか確認するのが良いかと思います。

http://packages.debian.org/stable/net/snmpd

◎質問者からの返答

/etc/init.d/snmpdでsnmpを起動した場合にPIDファイルは存在してました。権限についてもrootでした。


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ