- 締切済み
セグメンテーションエラーの原因がわからず困っています。
こんにちは。 プログラムを実行すると「セグメンテーションエラー」と表示されほとほと困っています。力を貸して頂けないでしょうか。 以下がそのプログラムです。 #include<string.h> #include<unistd.h> #include<errno.h> #include<signal.h> #include<sys/types.h> main(){ FILE *fp,*fp2; int a; pid_t pid; pid = fork(); if(pid == 0){ fp = popen("tcpdump 'tcp[13] & 255 == 2' > file.txt","r"); system("sleep 1"); kill(pid,SIGTERM); } else{ fp2 = popen("wc -l file.txt","r"); fscanf(fp2,"%3d",a); printf("%d",a); } } プログラムの内容は、子プロセスとして動かしたtcpdumpにより出力されたfile.txtの行数を表示するものです。 tcpdumpを子プロセス化したのは、killコマンドで終了しないと止まらないからです。 以上で何か気づかれた事等ありましたら、是非ご教授いただきたいのですが可能でしょうか。環境はCentosです。どうぞよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- kazusanchi
- ベストアンサー率39% (13/33)
#3のものです。 追加で。 aのところを&aにしてみてください。 #1の方と同じというわけではありませんが、リファレンスを読み直してみることをおすすめします。
- kazusanchi
- ベストアンサー率39% (13/33)
fscanf(fp2,"%3d",a); ↓ fscanf(fp2,"%d",a); ではないでしょうか?
- salsberry
- ベストアンサー率69% (495/711)
1. デバッガ内で実行してみましたか? 2. kill()を呼ぶとき、pidの値は何ですか? それは意図通りですか? 3. tcpdumpをpopen()で起動しているのはなぜですか? せっかく作成されたパイプが全く使われていませんが。 4. file.txtは出力する必要があるのですか? もし出力結果をファイルとして残しておく必要がないのであれば、tcpdumpの結果を直接パイプから読み出して行数を数えれば済むように思います。 5. sleep()関数を使わず、わざわざsystem()でsleepコマンドを呼んでいるのはなぜですか? 6. tcpdumpが終了してからwcが起動されることは保証されていますか? 7. main()の型を宣言しないのはなぜですか? ちょっと意地悪でしょうか。
- LuzBlue
- ベストアンサー率50% (1/2)
scanf系の標準関数の仕様をよく見てみるといいと思います。