[編集:] 多くのコードを削除しました。そして、私はそれをより単純な質問に減らしました。
この変数を渡してもよろしいですか...
char Record_Info[file_length + 1];
次のように、別の関数に変換します。
listdir(tempdesc, 0, sockid, Record_Info);
このヘッダーを使用します:
int listdir(char *dirname, int lvl, int sockid, char Record_Info[])
そして、listdir() は自分自身を何度も呼び出すことができますか?
.
* 元の質問 *
別の目がこれを見ることができるかどうか疑問に思っていました。それは機能していましたが、さらにコードを追加しました (おそらくsprintf
、下部の近くにもっとありSegmentation fault
ます)。
このプログラムは Web ページを正しく作成/送信しますが、関数からsend_recordings_list()
関数に戻るとクラッシュしparsing_request()
ます。ファイルからデータをフォーマットする方法を理解する必要はないと思いますが、とにかくそのビットを含めました。
ほとんどの場合、私は静的変数を使用しており、free()
何かしようとすると、別のセグ フォールトまたは gcc lib フォールトが発生します。また、 functions() 間で変数を渡すことが問題を引き起こしている可能性があるかどうかもわかりませんか?
また、別の関数 (ここには示されていません) が約 4MB の Web ページを送信します。これを何度も呼び出すことができ、クラッシュしません。// ******
興味のある行にいくつか配置しましたか?
そうそう、私はまだ標準的なエラー処理をあまり行っていません... (後で行います)。
.
だからそれはで始まりますparsing_request()
に行くsend_recordings_list()
に行きlistdir()
ます。(これは自分自身を何度も呼び出します)
戻るsend_recordings_list()
. (ここでセグフォルト)
戻るparsing_request()
.
「ああ、あなたが何をしたかわかりましたfool
……」と言う人もいると思います
組み込み Linux 2.6.27、GCC 4.2.4、32MB RAM
void parsing_request(int sockid, char *buff)
{
char *res_line=malloc(MAXLINE), path[MAXLINE], *line;
// Cut code
if (strcmp(line, "/recordings_body.htm") == 0)
{
send_recordings_list (sockid); // ****** IT GOES HERE 1st ******
return;
}
free (res_line);
return;
}
int send_recordings_list(int sockid)
{
int hnd;
int hnd2;
char tempdesc[MAX_PATH_LENGTH];
// Copy all of the data <1 MiB (Slow reading)
int file_length = lseek (hnd2, 0, SEEK_END);
char Record_Info[file_length + 1]; // ******
lseek (hnd2, 0, SEEK_SET);
read (hnd2, Record_Info, file_length);
close (hnd2);
// Cut out code
del_file_cnt = 0;
sprintf (tempdesc, "%s/Recordings", TOPPY_DIR);
listdir(tempdesc, 0, sockid, Record_Info); // ***** Major 2nd call here
return 0;
}
int listdir(char *dirname, int lvl, int sockid, char Record_Info[])
{
int i;
DIR* d_fh;
struct dirent* entry;
char longest_name[4096];
char tempdesc[4096], morespace[128];
int row_col;
char chan_name[128], alt_name[128], desc[500], category[128], rec_time[14], start_time[14], end_time[14];
char trim_file_name[128], trim_file_name2[128], trim_alt_name[128], file_links[1535];
char logo[128];
int length, u_score, dot;
char *looky_pos1, *looky_pos2;
int is_match;
struct tm tm_rec, tm_start, tm_end;
time_t tim_rec, tim_start, tim_end;
// Cut out code
return 0;
}