gpt4 book ai didi

c - 在命令行上终止 C 程序,但确保编写器已完成编写

转载 作者:太空宇宙 更新时间:2023-11-04 08:11:56 25 4
gpt4 key购买 nike

我有一个将数据包数据写入输出文件的 C 服务器。问题是我使用控制 c 在终端中终止了服务器,并且我注意到我的输出文件从未完成写入。有没有办法确保我的输出文件在退出前被完全写入?

(我知道我可以让服务器运行更长时间,所以我确定我想要的数据已经写入,但我正在寻找替代方法)

谢谢

这是我的代码供引用。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/time.h>

int PORT_NUM = 0;
int RecordRate = 3000;

typedef struct timeval timeval;
timeval time_;


void error(const char *msg)
{
perror(msg);
exit(1);
}

int main(int argc, char *argv[])
{
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[1000000];
struct sockaddr_in serv_addr, cli_addr;
int n;
FILE *fp;

PORT_NUM = atoi(argv[1]);
fp = fopen(argv[2],"w");

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
//portno = atoi(argv[1]);
portno = PORT_NUM;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
error("ERROR on binding");
listen(sockfd,10);
clilen = sizeof(cli_addr);

newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0)
error("ERROR on accept");

int counter = 0;
int total_bytes_sent = 0;

while(1){

bzero(buffer,1000000);
n = read(newsockfd,buffer,999999);

if (n < 0) {
error("ERROR reading from socket");
}
else if (n != 0) {
total_bytes_sent += n;
gettimeofday(&time_, NULL);

if(counter%RecordRate==0){
printf("counter %d \n", counter);
fprintf(fp,"\"%d\",\"%ld\",\"%d\",\"%d\",\"%d\"\n", counter, time_.tv_sec, time_.tv_usec, n,total_bytes_sent);
}

counter++;

//print format: packet number, time Sec, time milli Sec, bytes in packet, total bytes sent
// example: "11182","1465921447","196422","3100","26821100"

}
}
fclose(fp);
close(newsockfd);
close(sockfd);
return 0;
}

最佳答案

您可以为 SIGINT 设置一个自定义处理程序,在其中设置一个标志,然后在设置该标志时优雅地退出。

#include <stdlib.h>
#include <signal.h>

volatile sig_atomic_t flag = 0;

void handle_int(int sig)
{
flag = 1;
}

int main()
{
signal(SIGINT, handle_int); // intercept SIGINT

while (!flag)
{
// do work ...
}
// cleanup, fflush, etc...
return 0;
}

请注意,直接在信号处理程序中调用 fflush 是不安全的。

//do work 部分显然应该相对较短,以便在应用程序的整个生命周期中定期检查 flag

关于c - 在命令行上终止 C 程序,但确保编写器已完成编写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38751319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com