每隔'x'秒从C ++程序中提取变量的值

时间:2017-02-26 11:19:27

标签: c++

每隔'x'秒如何做?我有一个客户端 - 服务器回显程序,我需要在图表中每秒绘制吞吐量。该程序使用Ubuntu 14.04中的g++编译。我想从外部观察这个程序,让它每隔x秒输出一个文件中的值。客户端的源代码,我需要每隔1秒获得吞吐量:

while(interval > 0){
  for(int i = 0;i < no_of_packets;i++){
    currentTime(buffer_rcvd);
    bytes_sent = sendto(socket_id, buffer_rcvd, sizeof(buffer_rcvd), 0, (struct sockaddr *) &server_addr, addr_size);
    buffer_rcvd[bytes_sent] = '\0';
    bytes_rcvd = recvfrom(socket_id, buffer_rcvd, sizeof(buffer_rcvd), 0, (struct sockaddr *) &server_addr, &addr_size);
    cout << "Received message on trip " << trip << " : " << buffer_rcvd << endl;
  }
  no_of_packets++, trip++;
  sleep(interval--);
}

2 个答案:

答案 0 :(得分:2)

答案取决于您所需的准确度,平台等等。以下是一些建议:

计时

将它放在代码中经常执行的某个位置。但是,这仅适用于使用C ++ 11(或更高版本)的情况。你应该!

using namespace std::chrono;

/* Put this outside of your function or loop */
auto lastOutputTime = steady_clock::now();

/* Put this inside of your function or loop */
auto now = steady_clock::now();
if (now - lastOutputTime >= 60s) {
  auto throughput = getCurrentThroughput();
  std::cout << "Throughput: " << throughput << std::endl;
  lastOutputTime = now;          
}

时钟()

甚至可以在C中工作的另一个选项(除了输出本身)。但是,正如@Some程序员老兄所指出的,这种方法取决于平台。通常用这个而不是挂钟时间来测量CPU时间。所以它可能或者可能不够准确。

/* Put this outside of your function or loop */
clock_t lastOutputTime = 0;
clock_t now = clock();

/* Put this inside of your function or loop */
if(now - lastOutputTime > CLOCKS_PER_SEC*60) {
  double throughput = getCurrentThroughput();
  std::cout << "Throughput: " << throughput << std::endl;
  lastOutputTime = now;
}

要使用clock(),您必须在标题中添加以下内容

#include <ctime>

时间()

如果您需要挂钟时间并且C ++ 11不可用,您可以使用time()。但是,它只提供一秒的精确度,对您来说可能或不够。

/* Put this outside of your function or loop */
time_t lastOutputTime;
time(&lastOutputTime);

/* Put this inside of your function or loop */
time_t now;
time(&now);
if(difftime(now,lastOutputTime) >= 60) {
  double throughput = getCurrentThoughput();
  std::cout << "Throughput: " << throughput << std::endl;
  lastOutputTime = now;
}

答案 1 :(得分:0)

你的问题真的不清楚。

以下是一些想法。

如果您正在对程序进行编码并且可以修改其源代码,则可以在其中添加一些服务器功能以用于检测目的。例如,您可以添加一些HTTP服务器功能:您将使用某些HTTP服务器库,例如libonion,您可以使用改进您的代码,使其在http://localhost:4567/status URL上提供,并作为对每个GET http://localhost:4567/status HTTP请求的HTTP响应,提供具有适当状态变量的一些JSON内容。顺便说一句,这是我的建议

您也可以使用所有调试选项编译您的程序(例如使用g++ -g -O编译它)并使用一些聪明的脚本,它将:使用SIGSTOP信号停止进程,启动一些gdb -p命令,使用backtraceprint gdb命令,并继续使用SIGCONT

进程

您可能还会考虑proc(5)。也许聪明地使用strace(1)就足够了。

您可以将重要变量放入共享内存段(使用指针和一些公共struct,编写实用程序以从该共享内存段读取)。阅读shm_overview(7)(和sem_overview(7)以进行同步)。

您可能会想到其他inter-process communications。请参阅socket(7)pipe(7)fifo(7)并阅读Advanced Linux Programming

你可以启动一个额外的(仪表)线程,它会登录到某个文件等等......

另见time(7)&amp; signal(7)

也许您的计划应该有一个合适的event loop(请参阅poll(2) ...)。

否则,您的任务是不可能的:在运行时,C ++变量不再存在(它们位于寄存器或内存位置)。

因此,根据您真正想做的事情,这可能很容易或不可能。