FIFO读入获取分段故障 [英] FIFO read in get segmentation fault
本文介绍了FIFO读入获取分段故障的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
当我在无限循环中从fifo第二次读取时,我得到分段错误。我不明白为什么以及如果我不调用函数servi(...)创建一个新的发送数据客户端我没有得到分段错误。我真的不明白为什么。
这是代码。
I get segmentation fault when i read for the second time from the fifo in the infinite loop.I don't understand why and if i don't call the function servi(...) that creat a new that send data to client i don't get a segmentation fault.I really don't understand why.
This is the code.
#include <pthread.h>//serve per il multithreading
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>//serve per gestione errori
#include <fcntl.h>//serve per le fifo
#define MAX_BYTES (300);
//VARIABILI GLOBALI
int lung_max_msg = 30;
int lung_min_chiave = 3;
int lung_max_chiave = 10;
char nome_server[30];
void* servi(char* nome_client,char* input_messaggio,char* input_chiave,char codec);
//void codificatore(char codec,char* msg,char* chiave,char* risultato);
int main()
{
pthread_t pid;
//pthread_t pid2,pid3;
char* nome_client;
int buf = MAX_BYTES;
char buffer[buf];
char* tmpcodec;
char codec;
char* input_messaggio;
char* input_chiave;
int numread;
int fd ;
strcpy(nome_server,"miafifo");
//strcpy(nome_client,"fifo_lettura");
printf("Programma avviato......\n");
printf("Attesa dei client......\n");
//CREAO LA FIFO PER LEGGERE LE RICHIESTE DAI CLIENT
int ret_val = mkfifo(nome_server,0777);
if((ret_val == -1) && (errno != EEXIST))
{
perror("Errore durante la creazione della fifo!");
exit(1);
}
printf("Ho creato la FIFO\n");
//apro la fifo
fd = open("miafifo",O_RDONLY);
printf("------Ho aperto la FIFO SERVER-------- \n");
int i = 0;
while(1)//continuo a cercare di leggere la fifo per vedere se ci sono altri client da servire
{
printf("Ciclo: %d , sto per leggere...\n",i);
i++;
numread = read(fd,&buffer,buf); // <----- THERE IS THE PROBLEM
if(numread < 0)
{
perror("Errore lettura buffer!\n");
exit(1);
}
printf("\nIl buffer contiene : \"%s\"\n",buffer);
if(strcmp(buffer,"") != 0)
{
printf("nuovo client..\n");
//prelevo nome_client,messaggio,chiave e codec
nome_client = strtok(buffer,"$");
input_messaggio = strtok(NULL,"$");
input_chiave = strtok(NULL,"$");
tmpcodec = strtok(NULL,"$");
codec = tmpcodec[0];
printf("Ho prelevato i dati...\n");
printf("Nome client = %s \n",nome_client);
printf("Ho letto tutti i dati\n");
//creao un thread per gestire il client
//IF I DON'T CALL THIS FUNCTION THE READ WORKS..... pthread_create(&pid,NULL,servi(nome_client,input_messaggio,input_chiave,codec),NULL);
//printf("Ho finito l'esecuzione del thread....\n");
//pthread_join(pid,NULL);
//printf("Ho chiuso la fifo del server....\n");
//strcpy(buffer,"");
//close(fd);//chiudo la fifo del server
printf("Primo client servito..\n");
}
// memset(buffer,0,sizeof(buffer));
strcpy(buffer,"");
}//fine while(1)
printf("Sto chiudendo il server.....\n");
//unlink(fd);
exit(0);
}
void codificatore(char codec,char* msg,char* chiave,char* ris,int lung_msg,int lung_chiave)
{
printf("Entro nella procedura codificatore()\n");
printf("\ncodec = %c ,msg = %s ,chiave = %s ,ris = %s ,lung_msg = %d ,lung_chiave = %d \n\n\n",codec,msg,chiave,ris,lung_msg,lung_chiave);
int maiuscolo;
int i,j;
for(i = 0,j=0; i < lung_msg;i++)
{
//controllo se nel risultato la letterA sara maiuscola o minuscola
//printf("ciclo for i = %d \n",i);
if(isupper(msg[i]))
{
maiuscolo = 1;
}
else
{
maiuscolo = 0;
}
//trasformo tutto in minuscolo per fare piu semplicemente le operazioni di calcolo e traslitterazione
//printf("Trasformo tutto in minuscolo\n");
msg[i] = tolower(msg[i]);
chiave[i] = tolower(chiave[i]);
//printf("Ho fatto una trasformazione...\n");
if( msg[i] == ' ')
{
ris[i] = ' ';
//printf(" ");
}
else
{
//printf("Stampo dei valoti per il testing...\n");
//printf("%d,",msg[i] - 96);
//printf("ho stampato un valore...\n");
//printf("%d",chiave[j] - 96); //<----- segmentation fault!!!!!!!!!!!
//printf("Ho finito di stampare...\n");
//printf("controllo chiave\n");
if(chiave[j] != ' ')
{
//printf("entro nel ciclo...\n");
if(codec == '1')
{
//printf("Inzio la codificazione di una lettera\n");
//questa trasformazione deve funzionare anche su codifiche diverse
ris[i] = ( ((msg[i] - 96 ) + (chiave[j] - 96 )) % 26) + 96;
//printf("Ho fatto la codifica di una lettere!\n");
}
else
{
ris[i] = ( ((msg[i] - 96 ) - (chiave[j] - 96 )));//+ 96;
if(ris[i] < 1)
{
ris[i] = 26 + ris[i];
}
printf(" : %d,",ris[i] );
ris[i]+= 96;
}
}
else
{
ris[i] = ' ';
}
if(maiuscolo)
{
ris[i] = toupper(ris[i]);
}
j = (j + 1) % lung_chiave;
}
//printf("\n\n");
}
ris[lung_msg] = '\0';
//stampa RISULTATO
}
void* servi(char* nome_client,char* input_messaggio,char* input_chiave,char codec)
{
printf("Etro in servi()\n");
char msg[31];
char chiave[11];
char ris[30];
int m;
char errore_input = '0';
char msg_errore[300];
//creao la fifo per mandare dati al client
int fb = open(nome_client,O_WRONLY);
printf("Ho aperto la FIFO per la scrittura.....\n");
//CONTROLLO DATI IN INPUT
int lung_chiave = strlen(input_chiave);
int lung_msg = strlen(input_messaggio);
char* tmperror[10];
strcpy(msg_errore,"");
if(lung_msg > lung_max_msg)
{
sprintf(tmperror,"%d",lung_max_msg);
strcat(msg_errore,"\n\nLunghezza massima messaggio = ");
strcat(msg_errore,tmperror);
errore_input = '1';
}
if(lung_chiave < lung_min_chiave)
{
sprintf(tmperror,"%d",lung_min_chiave);
strcat(msg_errore,"\n\nLunghezza minima chiave = ");
strcat(msg_errore,tmperror);
errore_input = '1';
}
if(lung_chiave > lung_max_chiave)
{
sprintf(tmperror,"%d",lung_max_chiave);
strcat(msg_errore,"\n\nLunghezza massima chiave = ");
strcat(msg_errore,tmperror);
errore_input = '1';
}
strcpy(msg,input_messaggio);
strcpy(chiave,input_chiave);
//funzione che codifica il messaggio
//char ascii ->stampabili iniziano dal numero 32 al 126
if(errore_input == '0')
{
printf("\nSto elaborando il msg!\n\n");
sleep(1);
//INVIO TUTTI I DATI ALLA FUNZIONE CHE CODIFICA DECODIFICA
//void codificatore(char codec,char* msg,char* chiave,char* ris,int lung_msg,int lung_chiave)
codificatore(codec,msg,chiave,ris,lung_msg,lung_chiave);
printf("Risultato : ");
for(m = 0;m < lung_msg; m++)
{
printf("%c ",ris[m]);
}
}//fine controllo errore input
//ORA INVIO IL RISULTATO AL CLIENT
if(errore_input == '1')
{
printf("\nERRORE:%s\n",msg_errore);
write(fb,"34$",3);//indico al client che c'è stato un errore
write(fb,msg_errore,strlen(msg_errore));
write(fb,"$",1);
}
else//invio il risultato al client
{
write(fb,"27$",3);//indico al cient che il risultato è corretto e no ci sono errori
write(fb,ris,strlen(ris));
write(fb,"$",1);
printf("\nRisultato inviato al client\n");
}
//chiusura fifo
//close(fb);
printf("\n-------------------------------------------------------------------------\n");
sleep(1);
}
推荐答案
);
input_messaggio = strtok(NULL,
"); input_messaggio = strtok(NULL,"
>
);
input_chiave = strtok(NULL,
"); input_chiave = strtok(NULL,"
);
tmpcodec = strtok(NULL,
"); tmpcodec = strtok(NULL,"
>
这篇关于FIFO读入获取分段故障的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文