虽然真的不行

时间:2012-08-28 10:18:04

标签: c printf graphite

我有以下代码:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
  time_t result;
  char   hostname[10] = "ws45new";
  char   graphite[10] = "127.0.0.1";
  char   buf[1024];
  int    n = 0;
  int    num = 0;
  int    graphiteport = 2003;

  while (1 == 1)
  {
    result = time(NULL);
    n = n + 1;
    if (n >= 100)
      n = 0;
    printf("\n %d", n);
    // snprintf(buf, sizeof(buf), "echo \"stats.ws45new.test %d %d \" | nc 127.0.0.1 2003", n, result);
    num = sprintf(buf, "echo \"stats.ws45new1.test %d %d \" | nc 127.0.0.1 2003", n, result);
    system(buf);
    printf("\n %s", buf);
    sleep(2);
  }
  return 0;
}

这应该产生类似锯齿信号的东西,仅用于测试。我的问题是,当我运行程序时它没有做任何事情。

如果我按Ctrl-C停止它,程序会在while循环中迭代一次。它应该向石墨服务器发送一些统计数据,我用它来了解石墨是如何工作的。从我所看到的它与连接函数有关sprintfsnprintf也以相同的方式行事)。

如果我注释掉那条线它可以正常工作并生成我想要的数字(以及时代),但我需要连接才能将所需的动态信息发送到石墨。

如果有人知道为什么这些连接功能不尊重while功能,请告诉我,因为我真的很好奇。此外,我对其他建议持开放态度,但我宁愿不深入,比如创建套接字而不使用nc和系统,因为我对C语言不太好。

1 个答案:

答案 0 :(得分:2)

程序很可能会卡在系统调用上。

您正在打印不带尾随换行符的文本,因此它将保留在缓冲区中,直到打印出换行符,这是在system调用后执行的。