2016-09-23 82 views
-1

晚上好,我需要創建一個程序,要求3段名稱,每個段將要求一個值。我的總內存是2000個單位。我需要使用結構和fifos來在客戶端(將從用戶獲得輸入)和服務器(將處理總單位)之間進行通信。客戶端將發送每個段的開始和結束地址,以及任何剩餘的內存。c語言內存管理與字符串段和fifos

我的問題一旦我運行是我得到了分段錯誤。我無法真正看到我可能會覆蓋內存的位置,或者我是否在某個時候重置了內存。歡迎任何意見或建議,謝謝。

客戶端代碼:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#include <fcntl.h> 


// creating the struct for the program 
struct probsiz{ 
    int seg1 [1]; //segment 1 size 
    int seg2 [1]; //segment 2 size 
    int seg3 [1]; //segment 3 size 
    int segsum [7]; //sum for all the segments 
    int leftov [1]; //memory leftovers 

} ; 

struct probseg {  

    char segment[64]; //segments 
}; 


main (void) 
{ 
    struct probsiz numbs; //defining the structures 
    struct probseg names; 

    int fda; // to write to character server 
    int fdb; // to read response from character server 

    //setting up the memory 

    memset(numbs.seg1, 0, sizeof(struct probsiz)); //setting up memory for the first segment 
    memset(numbs.seg2, 0, sizeof(struct probsiz)); //setting up memory for the second segment 
    memset(numbs.seg3, 0, sizeof(struct probsiz)); //setting up memory for the third segment 
    memset(numbs.segsum, 0, sizeof(struct probsiz));// setting up memory for the sum of all segments 
    memset(numbs.leftov, 0, sizeof(struct probsiz)); //setting up memory for the first segment 
    memset(names.segment, 0, sizeof (struct probseg));// setting up memory for the segments 




    //reading the requested memory and segment name from the user 
    printf("Client: Please enter requested memory 1: "); 
    scanf("%d", &numbs.seg1[0]); 
    while (numbs.seg1 <=0){ 
     printf("Client: please enter a valid request: "); 
     scanf("%d", &numbs.seg1[0]); 
    } 
    printf("Client: Please enter segment 1 name: "); 
    scanf("%s", names.segment[0]); 


    printf("Client: Please enter requested memory 2: "); 
    scanf("%d", &numbs.seg2[0]); 
    while (numbs.seg1 <=0){ 
     printf("Client: please enter a valid request: "); 
     scanf("%d", &numbs.seg2[0]); 
    } 
    printf("Client: Please enter segment 2 name: "); 
    scanf("%s", names.segment[1]); 


    printf("Client: Please enter requested memory 3: "); 
    scanf("%d", &numbs.seg3[0]); 
    while (numbs.seg3 <=0){ 
     printf("Client: please enter a valid request: "); 
     scanf("%d", &numbs.seg3[0]); 
    } 
    printf("Client: Please enter segment 3 name: "); 
    scanf("%s", names.segment[2]); 

    //send and write into the fifos 

    printf("\nClient: Got the sizes sent now waiting for server's response\n"); 

write(fda, &numbs, sizeof(struct probsiz)); 
write(fda, &names, sizeof(struct probseg)); 


    //read from the fifos 
read(fdb, &numbs, sizeof(struct probsiz)); 

if (numbs.leftov[0] >=0) { 

    printf("\nClient: address for segment 1 is: %d - %d", numbs.segsum[0], numbs.segsum[1]); 
    printf("\nClient: address for segment 2 is: %d - %d", numbs.segsum[2], numbs.segsum[3]); 
    printf("\nClient: address for segment 3 is: %d - %d", numbs.segsum[4], numbs.segsum[5]); 
    printf("\nClient: leftover memory is: %d", numbs.leftov[0]); 
    printf("\nall done!"); 
} 
else 
{ 
    printf("\nClient: segment size is over the capacity, please try again"); 
    printf("\nall done!\n"); 

} 

    //this closes the fifos 
    close(fda); 
    close(fdb); 


    printf ("\nall done!\n"); 

} 

服務器代碼:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#include <fcntl.h> 



// creating the struct for the program 
struct probsiz{ 
    int seg1 [1]; //segment 1 size 
    int seg2 [1]; //segment 2 size 
    int seg3 [1]; //segment 3 size 
    int segsum [1]; //sum for all the segments 
    int leftov [1]; //memory leftovers 

} ; 

struct probseg {  

    char segment[64]; //for the segments 
}; 

main (void) 
{ 
    struct probsiz numbs; // structure definitions 
    struct probseg names; 


    int fda; // to read from client char 
    int fdb; // to write to client char 
    int finish; // lets me know that client is done 
    int i; // because C needs this defined as int 
    int m=2000; //total memory units 
    int mtot; //memory total from the sum of all the segments 

    //setting up the memory 

    memset(numbs.seg1, 0, sizeof(struct probsiz)); //setting up memory for the first segment 
    memset(numbs.seg2, 0, sizeof(struct probsiz)); //setting up memory for the second segment 
    memset(numbs.seg3, 0, sizeof(struct probsiz)); //setting up memory for the third segment 
    memset(numbs.segsum, 0, sizeof(struct probsiz));// setting up memory for the sum of all segments 
    memset(numbs.leftov, 0, sizeof(struct probsiz)); //setting up memory for the first segment 
    memset(names.segment, 0, sizeof (struct probseg));// setting up memory for the segments 


    /* Create the fifos and open them */ 
    if ((mkfifo("FIFO1",0666)<0 && errno != EEXIST)) 
    { 
    perror("cant create FIFO1"); 
    exit(-1); 
    } 
    if ((mkfifo("FIFO2",0666)<0 && errno != EEXIST)) 
    { 
    perror("cant create FIFO2"); 
    exit(-1); 
    } 
    if((fda=open("FIFO1", O_RDONLY))<0) 
    printf("cant open fifo to write"); 
    if((fdb=open("FIFO2", O_WRONLY))<0) 
    printf("cant open fifo to read"); 

    read(fda, &numbs, sizeof(struct probsiz)); //read the sizes 
    read(fda, &names, sizeof(struct probseg)); //read the segments 

    //printing out the characters on the server side to validate the data in 

    strcpy(names.segment, names.segment); 
    mtot=numbs.seg1[0]+numbs.seg2[0]+numbs.seg3[0]; 
    numbs.leftov[0]=m-mtot; 

    printf("Server: just got segment 1: %s", names.segment[0]); 
    printf("Server: just got segment 1 size: %d", numbs.seg1[0]); 

    printf("Server: just got segment 2: %s", names.segment[0]); 
    printf("Server: just got segment 2 size: %d", numbs.seg2[0]); 

    printf("Server: just got segment 3: %s", names.segment[0]); 
    printf("Server: just got segment 3 size: %d", numbs.seg3[0]); 


    //calculation of memory addresses 
    numbs.segsum[0]=0; 
    numbs.segsum[1]= numbs.seg1[0]-1; 
    numbs.segsum[2]= numbs.seg1[0]; 
    numbs.segsum[3]= numbs.segsum[2]+numbs.seg2[0]-1; 
    numbs.segsum[4]= numbs.segsum[3]+1; 
    numbs.segsum[5]= numbs.segsum[4]+numbs.seg3[0]; 
    numbs.segsum[6]=0; 


    write(fdb, &numbs, sizeof(struct probsiz)); 

    if (numbs.leftov[0] >=0) { 

    printf("\nClient: address for segment 1 is: %d - %d", numbs.segsum[0], numbs.segsum[1]); 
    printf("\nClient: address for segment 2 is: %d - %d", numbs.segsum[2], numbs.segsum[3]); 
    printf("\nClient: address for segment 3 is: %d - %d", numbs.segsum[4], numbs.segsum[5]); 
    printf("\nClient: leftover memory is: %d", numbs.leftov[0]); 
    printf("\nall done!"); 
} 
else 
{ 
    printf("\nClient: segment size is over the capacity, please try again"); 
    printf("\nall done!\n"); 

} 

    if(finish == 1) 
    printf("\nServer: This says I am ready to close "); 
    close(fda); 
    close(fdb); 
    unlink("FIFO1"); 
    unlink("FIFO2"); 
} 
+1

這裏是;) – LPs

+1

編譯符號(使用選項'-g'爲GCC),然後使用調試器(例如GBD運行程序('gdb') )。在崩潰後,執行一個'bt '並查找使程序崩潰的代碼行以及其調用堆棧。 – alk

+1

哪個程序崩潰,客戶端或服務器或兩者兼而有之? – alk

回答

0

不知道這是唯一的問題,但你的memset很可能導致分段錯誤。

您已經定義:

struct probsiz{ 
    int seg1 [1]; //segment 1 size    size = sizeof(int) 
    int seg2 [1]; //segment 2 size    size = sizeof(int) 
    int seg3 [1]; //segment 3 size    size = sizeof(int) 
    int segsum [7]; //sum for all the segments size = sizeof(int*7) 
    int leftov [1]; //memory leftovers   size = sizeof(int) 

} ; 

probsiz的總規模中的sizeof(INT * 11)

現在讓我們來看看這條線,例如:

memset(numbs.leftov, 0, sizeof(struct probsiz)); //setting up memory for the first segment 

你說的是計算機將從numbs.leftov開始的0填充到整個結構的長度。

希望我幫助清晨...

+0

我會盡力處理它今天早上,我真的很累,昨天晚上,感謝我現在正在處理的建議 –

+0

以及我將sizeof語句的memsets更改爲結構上的實際數字,並且我仍然遇到了分段錯誤,是否可以事實上,我得到的是前一個寫的分段名稱? –

+0

終於使客戶端工作,但服務器沒有收到任何數據,可能是我的fifos不能正常工作 –