とっておきの手土産を教えて

こんにちは。

プログラムを実行すると「セグメンテーションエラー」と表示されほとほと困っています。力を貸して頂けないでしょうか。
以下がそのプログラムです。

#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です。どうぞよろしくお願いします。

A 回答 (4件)

1. デバッガ内で実行してみましたか?


2. kill()を呼ぶとき、pidの値は何ですか? それは意図通りですか?
3. tcpdumpをpopen()で起動しているのはなぜですか? せっかく作成されたパイプが全く使われていませんが。
4. file.txtは出力する必要があるのですか? もし出力結果をファイルとして残しておく必要がないのであれば、tcpdumpの結果を直接パイプから読み出して行数を数えれば済むように思います。
5. sleep()関数を使わず、わざわざsystem()でsleepコマンドを呼んでいるのはなぜですか?
6. tcpdumpが終了してからwcが起動されることは保証されていますか?
7. main()の型を宣言しないのはなぜですか?

ちょっと意地悪でしょうか。
    • good
    • 0

#3のものです。


追加で。
aのところを&aにしてみてください。
#1の方と同じというわけではありませんが、リファレンスを読み直してみることをおすすめします。
    • good
    • 0

fscanf(fp2,"%3d",a);



fscanf(fp2,"%d",a);
ではないでしょうか?
    • good
    • 0

scanf系の標準関数の仕様をよく見てみるといいと思います。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報