每隔'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--);
}
答案 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
命令,使用backtrace
和print
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。
你可以启动一个额外的(仪表)线程,它会登录到某个文件等等......
也许您的计划应该有一个合适的event loop(请参阅poll(2) ...)。
否则,您的任务是不可能的:在运行时,C ++变量不再存在(它们位于寄存器或内存位置)。
因此,根据您真正想做的事情,这可能很容易或不可能。