0

C で http サーバーを実装しています。ヘッダーを書き込むためのカスタム関数があります。私がそれを呼び出しても、何もしません。関数内に任意の printf を配置して、それが呼び出されることを確認しましたが、出力も生成されません。この問題を除けば、プログラムは正常にコンパイルされ、意図したとおりに正常に動作します。サーバーに接続できますが、この問題により空の応答が返されます。代わりに簡単に使用できますfprintfが、問題を理解したいです。関数は次のように宣言されます。

void write_response_ln(FILE *fp, char *format, ...)
{
    va_list args;
    printf("dsgsfdg");
    strcat(format, "\r\n");
    va_start(args, format);
    vfprintf(fp, format, args);
    va_end(args);
}

呼び出し元のファイルとは別に、独自のファイルにあります。4 回呼び出されても、クライアント プロセスは空の応答を報告します。なぜこれが起こるのですか?ところで、Linuxでgcc 4.7を使用してこれをコンパイルしています。


呼び出し元関数は次のとおりです。

static pid_t handle_connection(size_t bfrsz, int fd_connect, pid_t kid_pid)
{
    int     c;
    char    *headers    = malloc(bfrsz);
    FILE    *res        = fdopen(fd_connect, "a+");

    kid_pid = getpid();

    bzero(headers, bfrsz);

    fgets(headers, bfrsz, res);

    fprintf(stdout, "REQ: %s\n", headers);
    write_response_ln(res, "HTTP 200 OK");
    write_response_ln(res, "Content-Type:text/html");
    write_response_ln(res, "");
    write_response_ln(res, "I don't have a parser yet.");

    fclose(res);
    // Commit suicide.
    printf("Transaction: Complete: Kill: [%d]\n", kid_pid);
    sleep(1);
    kill(kid_pid, SIGINT);
    free(headers);
    return kid_pid;
}

そして、gdbを使用すると、これが得られました:

(gdb) break write_response_ln
Breakpoint 1 at 0x400f80: file headers.c, line 8.
(gdb) run
Starting program: /home/goktug/code/server/src/server 

Program received signal SIGSEGV, Segmentation fault.
0x0000003491239f24 in ____strtoll_l_internal () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.15-58.fc17.x86_64

ちょっとしたメモとして、私はまだ getopt 部分を行っていないので、引数なしで呼び出されるとプログラムはセグメンテーション違反を起こします。

4

1 に答える 1

3

定数である文字列リテラルを使用しています。

write_response_ln(res, "HTTP 200 OK");

そして、あなたはそれらを変更しようとしています:

strcat(format, "\r\n");

代わりに、一時的な非定数バッファを使用して、最初にフォーマットをコピーしてください。

于 2013-01-02T00:13:47.437 に答える