【问题标题】:While true not working [duplicate]虽然真的不工作[重复]
【发布时间】:2012-08-28 10:18:03
【问题描述】:

我有以下代码:

#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 循环中迭代一次。它应该向石墨服务器发送一些统计数据,我正在使用它来了解石墨是如何工作的。据我所见,它与连接函数sprintf 有关(snprintf 也以相同的方式起作用)。

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

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

【问题讨论】:

  • @Let_Me_Be 你是对的,snprintf 是具有该参数的函数;)
  • 使用 shell 脚本而不是尝试从头开始编写一些东西。
  • 我使用 bash 脚本得到了相同的行为。实际上这是从 bash 脚本重写的。
  • @auselen 如果您不想提供帮助,请不要发表评论。我用 C 语言是出于学习目的,因为我真的很想学习这门语言。
  • @bitmask 我要感谢您指出重复项,但情况不同。我的问题是系统功能从未终止,这就是它挂起的原因。

标签: c printf graphite


【解决方案1】:

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

您正在打印没有尾随换行符的文本,因此它将保留在缓冲区中,直到打印换行符,您在 system 调用之后执行此操作。

【讨论】:

  • 所以我应该在 sprintf 形成的字符串末尾添加\n 吗?
  • @primero No. 如果你使用printf("\n %d",n); 它只会打印一个空行。当下一个'\n' 放入缓冲区时,将打印该数字。
  • 我可以将这两个 printfs 注释掉,因为它们仅用于测试目的,但程序仍然挂起。我应该以某种方式清空缓冲区吗?
  • @primero 然后你的程序挂在system 调用上。您是否实际测试过该命令?你可以在straceltrace 下运行你的程序,看看它到底卡在哪里。
  • 你说得对,我忘了 strace。它卡在等待4上。在 SIGINT(ctrl C) 之后,它完成了它的工作,然后又被卡住了。谢谢你真的很有帮助。现在要进一步排除故障。
猜你喜欢
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 2014-12-11
  • 2014-06-23
  • 1970-01-01
相关资源
最近更新 更多