2011-08-03 5 views
0

私は、がsystem()関数を使用していないというシェルプログラムを書く必要があります。特徴の1つは、ワイルドカードを使用できることです。グロブを使用する方法やfnmatchの機能を使用する方法の良い例を見つけることができないように見えませんので、私は迷っています。これまでのところ私はいくつかのブログ機能を持っていますコード)。カスタムシェルのglob問題

glob変数がグローバルとして宣言されている場合、関数は部分的に機能します。ただし、その後のコマンドではエラーが発生します。例:

ls *.c 
produce correct results 
ls -l //no glob required 
null passed through 

だから私はそれをローカル変数にしようとしました。

int runCommand(commandStruct * command1) { 
if(!globbing) 
    execvp(command1->cmd_path, command1->argv); 
else{ 
    glob_t globbuf; 
    printf("globChar: %s\n", globChar); 
    glob(globChar, GLOB_DOOFFS, NULL, &globbuf); 
    //printf("globbuf.gl_pathv[0]: %s\n", &globbuf.gl_pathv[0]); 
    execvp(command1->cmd_path, &globbuf.gl_pathv[0]); 
    //globfree(&globbuf); 
    globbing = 0; 
} 
return 1; 

}

地元としてglobbufでこれをやって、それがglobbuf.gl_pathにnullを生成します[0]:これが今の私のコードです。理由を理解できないようだ。どのようにglobの作品が原因であるかもしれないか知っている人は誰ですか?必要に応じてさらにコードを投稿することができますが、これは問題がある場所です。

答えて

1

これが私の作品:

... 
glob_t glob_buffer; 
const char * pattern = "/tmp/*"; 
int i; 
int match_count; 


glob(pattern , 0 , NULL , &glob_buffer); 
match_count = glob_buffer.gl_pathc; 
printf("Number of mathces: %d \n", match_count); 

for (i=0; i < match_count; i++) 
    printf("match[%d] = %s \n",i,glob_buffer.gl_pathv[i]); 

globfree(&glob_buffer); 
... 

execvp機能はつまり、私はそれがすべての要素を使用して独自のchar ** argvコピーを作成するのが最も簡単になると思う、NULLポインタで終了する引数リストを見込んでいることを確認してglob_buffer.gl_pathv[]から、最後にNULLポインタがあります。

+0

マニュアルページによると、 'glob()'はすでにヌルポインタでバッファを送信しています。 – Ariel

1

あなたはGLOB_DOOFFSを求めていますが、予約するスロットの数はglobbuf.gl_offsには何も指定していません。単にglobbuf.gl_pathvすることができ&globbuf.gl_pathv[0]

はおそらくグローバル変数として、それはまた0

これに初期化されます。

globfree(globbuf)を必ず実行してください。

おそらく、多くのメモリリークや初期化されていないメモリへのアクセスがあるため、valgrindの下でプログラムを実行することをお勧めします。

+0

Hrmm。さて、私はそれがGLOB_DOOFFSにある意味があると思います。しかし、ローカルで手作業で0に初期化すると、全く動作しません。どのような提案がありますか?すべての記憶はバングラドに応じて世話をします。助けてくれてありがとう。 – yaegerbomb

+0

'man glob'の下にコード例があると思います。彼らもそうしているので、私は '&globbuf.gl_pathv [0]'について間違っていたようだ。それを超えて、私は知らない、申し訳ありません。おそらくバグはあなたが含まれていないコードの一部です。また、 'execvp'呼び出しを使わずにvalgrindを試してください。なぜなら、その呼び出しがプログラムを一掃して別のプログラムに置き換えるため、valgrindは何も見つけることができないからです。 – Ariel

+0

これは、execvpが呼び出された後に解放されないため、globでメモリリークを引き起こします。これは確かに問題です。これを回避する方法がわかりません。 – yaegerbomb

関連する問題