我正在用 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 部分,所以程序在不带参数的情况下调用时会出现段错误。