[英]Named Pipe Linux
Statitics:
Hora de inicio:(null)
Total pedidos:0
Pedidos recusados:0
Dominios locais:0
Dominios externos:0
Hora atual:17:5:14
typedef struct{
int pedidos;
int loc;
int ext;
int rej;
char* start;
} esta;
int fdpipe;
fd_set write_set;
//PROCESS 1--------------------------------------------------------------
作家:
esta* estatisticas;
estatisticas=(esta* )malloc(sizeof(esta));
estatisticas->start=convertTime(time(NULL));
estatisticas->ext=1;
estatisticas->loc=1;
estatisticas->rej=1;
estatisticas->pedidos=1;
if (mkfifo(mpconfs->pipe_stats,0600)<0)
{
perror("Cannot create pipe: ");
exit(0);
}
//escrever no pipe
if ((fdpipe=open(mpconfs->pipe_stats, O_WRONLY)) < 0)
{
perror("Cannot open pipe for writing: ");
exit(0);
}
while(1) {
//escrever no pipe
FD_ZERO(&write_set);
FD_SET(fdpipe, &write_set);
if (select(fdpipe+1, NULL, &write_set, NULL, NULL)>0) {
if(FD_ISSET(fdpipe,&write_set)){
write(fdpipe, &estatisticas, sizeof(esta));
}
}
}
讀者://過程2 -------------------------------------------- ----------------
fd_set read_set;
esta* estatisticas;
signal(SIGINT,catch_ctrlcProcEsts);
sleep(2);
if ((fdpipe=open(mpconfs->pipe_stats, O_RDWR)) < 0)
{
perror("Cannot open pipe for reading: ");
exit(0);
}
while(1){
FD_ZERO(&read_set);
// prepares read set to "listen" to the following FD
FD_SET(fdpipe, &read_set);
if (select(fdpipe+1, &read_set, NULL, NULL, NULL)>0) {
if(FD_ISSET(fdpipe,&read_set)){
read(fdpipe, &estatisticas, sizeof(esta));
imprimeStats(estatisticas);
}
}
}
}
void imprimeStats(esta* estatisticas){
char *horaAtual=convertTime(time(NULL));
printf("\nStatitics:\n");
printf("Hora de inicio:%s\n",estatisticas->start);
printf("Total pedidos:%d\n",estatisticas->pedidos);
printf("Pedidos recusados:%d\n",estatisticas->rej);
printf("Dominios locais:%d\n",estatisticas->loc);
printf("Dominios externos:%d\n",estatisticas->ext);
printf("Hora atual:%s\n\n",horaAtual);
}
char *convertTime(time_t time){
char *res;
int h, min, sec;
res=(char*)malloc(9*sizeof(char));
res[0]='\0';
h=(time/3600);
min=(time-3600*h)/60;
sec = time%60;
h=h%24;
sprintf(res,"%d:%d:%d", h, min, sec);
return res;
}
我認為我不會忘記任何事情。
您可能會誤用讀寫:您寫了read(fdpipe, &estatisticas, sizeof(esta));
但聲明為esta* estatisticas;
因此,您實際上發送了分配的地址以及一些垃圾(未定義的行為)
您可能打算寫: read(fdpipe, estatisticas, sizeof(*estatisticas))
順便說一句,您應該檢查讀取為已讀完成的字節數量,而不總是讀取您要求的所有字節(可能更少)
小心一點,您在寫入方面也犯了同樣的錯誤,請不要忘記也將其修復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.