2015-10-20 73 views
0

我正在使用C和膩子編寫客戶機/服務器程序。 這兩個c文件都在同一個系統上。客戶機/服務器打印出數組並寫回

我目前有一個問題,回寫客戶端它使用的框架以及打印出我的框架。它打印出3 0 9 8,但隨後開始打印出來13456756等

以下是我有:

服務器:

#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> 


    main (void) 
    { 
     int to_server; // to read from client 
     int from_server; // to write to client 
     int finish; // lets me know that client is done 
     int i,j,k,m,l; // because C needs this defined as int 
     int numClient;// number of clients 
     char temp[14]; 
     int page_size = 128; 
     int pages_left; 
     int max_frames=10; 
     int used_frames =0; 
     int frameUpdate=0; 
     int freeframe[10] = {3,0,9,8,7,5,1,4,2,6}; //this is the array 
     int numpage=0; 
     int frames; 
     int check; 
     int option; 
     int byte; 
     int getPage; 
     int getOffset; 
     int physical_Addr; 
     int offset; 
     int req[3]; 
     int again; 

     struct values{ 
      char privFifo[14]; 
      int memoryreq; 
     }cinput; 


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

     //get number of clients 
     printf("\nHow many clients?\n"); 
     scanf("%d", &numClient); 

     for(j =1; j <= numClient; j++){ 
      read(to_server, &cinput, sizeof(cinput)); 
      printf("\n\nFifo_%d \nMemory request %d", &cinput.privFifo, cinput.memoryreq); 
      req[j-1] = cinput.memoryreq; 
      if((mkfifo(cinput.privFifo,0666)<0 && errno != EEXIST)) 
      { 
      perror("cant create privFifo"); 
      exit(-1); 
      } 

      if((from_server=open(cinput.privFifo, O_WRONLY)<0)){ 
        printf("cant open fifo to write"); 
      } 

      // find number of pages need for request 
      numpage = cinput.memoryreq/page_size; 

      if((numpage * page_size) < cinput.memoryreq){ 
      numpage++; 
      } 

      sleep(1); 
      printf("\nPages needed %d", numpage); 
      write(from_server, &numpage, sizeof(numpage)); 

      printf("\n******Main Memory******"); 
      for(m = used_frames; m < numpage; m++){ 
      printf("\n* client: %d\tframe: %d", j, freeframe[m]); 
      frames = freeframe[m]; 
      write(from_server, &frames, sizeof(frames)); 
      } 

      used_frames = max_frames - used_frames; 
      pages_left = max_frames - numpage; 

//this is where I try to print out the available frames 
      printf("\n Frames available:"); 
      for(l = pages_left; l!= 0; l--){ 
       check = max_frames - l; 
       printf(" %d", freeframe[check]); 
       max_frames = check; 
      } 
      close(from_server); 
      unlink(cinput.privFifo); 
     } 

     printf("\nDONE!!!"); 
     close(to_server); 
     unlink("FIFO1"); 

客戶端:

#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> 

main (void) 
{ 
    int to_server; // to write to server 
    int from_server; 
    char temp[14]; // server puts string here 
    int clientID; 
    //int frames; 
    int numpage; 
    int i; 

struct values{ 
    char privFifo[14]; 
    int memoryreq; 
}cinput; 

    if((to_server=open("FIFO1", O_WRONLY))<0) 
    printf("cant open fifo to write\n"); 

    printf("writing data to to_server\n"); 
    printf("Client: Please enter number of memory units: "); 
    scanf("%d", &cinput.memoryreq); 
    printf("%d", cinput.memoryreq); 
    clientID = getpid(); 
    sprintf(cinput.privFifo, "Fifo_%d", getpid()); 
    printf("\nFifo name is %s", &cinput.privFifo); 
    write(to_server, &cinput, sizeof(cinput));//write client pid and memUnit to server 
    sleep(2); //give time to send 
    printf("\nClient: Got the character sent, now waiting for response "); 

    if ((mkfifo(cinput.privFifo,0666)<0 && errno != EEXIST)) 
    { 
    perror("cant create FIFO1"); 
    exit(-1); 
    } 
    if((from_server=open(cinput.privFifo, O_RDONLY))<0){ 
     printf("cant open fifo to write"); 
    } 
    read(from_server, &numpage, sizeof(numpage)); 
    printf("\nFrames Occupied %d", numpage); 

    close(to_server); 
    close (from_server); 
    unlink(cinput.privFifo); 

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

} 

任何幫助非常感謝。謝謝。

回答

1

我強烈懷疑問題是行used_frames = max_frames - used_frames;。由於used_frames最初爲0,因此它在第二次迭代時將其設置爲超過數組的末尾,因此當您運行for(m = used_frames; m < numpage; m++)時,開始將值打印到幀數組的末尾。 (順便說一句:請正確縮進。)。但是設置一個斷點並在調試器中運行以確保。

+0

不要採取這種錯誤的方式,但....我愛你xD(我也修復了我的縮進)。 – IndifferentOtaku

相關問題