功能没有被调用

时间:2013-01-01 23:48:34

标签: c variadic-functions gcc4.7

我在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部分,因此程序在没有参数的情况下调用时会出现段错误。

1 个答案:

答案 0 :(得分:3)

您正在使用字符串文字,它们是常量:

write_response_ln(res, "HTTP 200 OK");

并且您正在尝试修改它们:

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

相反,请使用临时非常量缓冲区并首先复制格式。