2012-08-28 58 views
-5

我有以下代码:虽然真正的工作不

#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函数,请让我知道,因为我真的很好奇。此外,我愿意接受其他建议,但我宁愿不深入研究,比如创建套接字,不使用数控系统和系统,因为我对C语言并不擅长。

+0

@Evert不,它不应该。 –

+0

@Let_Me_Be你说得对,snprintf是具有该参数的函数;) – Evert

+2

使用shell脚本而不是尝试从头开始写东西。 – auselen

回答

2

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

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

+0

所以我应该在sprintf形成的字符串的末尾添加'\ n'? – primero

+0

@primero号如果你使用'printf(“\ n%d”,n);'它只会打印一个空行。当下一个“\ n”放入缓冲区时,将打印该号码。 –

+0

我可以将两个printf注释掉,因为它们仅用于测试目的,但该程序仍然挂起。我应该以某种方式清空缓冲区吗? – primero