2012-10-25 3 views
0

두 가지 버전의 서버/클라이언트 응용 프로그램이 있습니다. 첫 번째 클라이언트는 텍스트 파일을 읽고 서버에 텍스트 데이터를 보내고 서버는받은 텍스트 데이터를 새 텍스트 파일 ("received.txt")에 씁니다. 쓰기가 끝나면 텍스트 파일을 화면에 인쇄합니다.동시에 2 개의 스레드로 파일을 읽고 쓰는 방법?

두 번째 버전에서 클라이언트는 똑같은 일을하지만 서버가 "received.txt"파일에 쓰는 동시에 화면에 데이터를 인쇄하기를 원합니다. 왜 그런 일을하는지 궁금해 할 것입니다. 필자는 파일에 쓰고 화면에 파일을 다시 인쇄하는 프로세스의 속도를 높이고 싶습니다. 내가 2 개의 쓰레드를 사용한다면 작업 속도가 빨라질 수도 있습니다.

문제가 발생했습니다. (pthreads를 처음 사용하는 경우입니다.). 서버가 데이터를 화면에 인쇄하기 전에 종료됩니다. 일정에 관한 것 같습니다. 새로 만든 스레드가 실행 중이고 주 스레드가 차단되어 있으면 파일을 읽을 필요가 없으며 새로 만든 스레드가 종료됩니다. 그게 문제에 대한 내 생각. 여기서 내가 달성하고자하는 것은 가능하다면이 읽기/쓰기를 동시에 할 수 있도록하는 것입니다. 나는 모든 잘못이 일을 해요, 아니면 내가 나를 여기

: 서버 (제 2 판)이다 알려 스레드/쓰기 simultenous 읽기을 기록하지 못할 경우

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <pthread.h> 
#include <time.h> 

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

//New Thread function 
void *printData() { 
    FILE *fp = fopen("received.txt" , "r"); 
    char buffer; 

    time_t time1 = time(NULL); 

    if(fp != NULL) { 
    while((buffer = fgetc(fp)) != NULL) { 
     printf("%c" , buffer); 
    } 
    fclose(fp); 
    } 

    time_t time2 = time(NULL); 
    double diff = difftime(time2 , time1); 
    printf("It took %.lf seconds.\n" , diff); 
    pthread_exit(NULL); 
} 

int main(int argc , char *argv[]) { 
    int sockfd , newsockfd , port_no , cli_length , n; 
    char buffer[256]; 
    struct sockaddr_in server_addr , client_addr; 
    FILE *fp; 

    int thread_Created = 0; 
    pthread_t thread; 

    if(argc < 2) { 
    fprintf(stderr , "ERROR , no port provided!"); 
    exit(1); 
    } 

    sockfd = socket(AF_INET , SOCK_STREAM , 0); 

    if(sockfd < 0) 
    error("ERROR opening socket."); 

    bzero((char *) &server_addr , sizeof(server_addr)); 
    port_no = atoi(argv[1]); 

    server_addr.sin_family = AF_INET; 
    server_addr.sin_port = htons(port_no);  
    server_addr.sin_addr.s_addr = INADDR_ANY; 

    if(bind(sockfd , (struct sockaddr *) &server_addr , sizeof(server_addr)) < 0) { 
    error("ERROR on binding."); 
    } 

    listen(sockfd , 5); 

    cli_length = sizeof(&client_addr); 
    newsockfd = accept(sockfd , (struct sockaddr *) &client_addr , &cli_length); 
    if (newsockfd < 0) 
    error("ERROR on accept."); 

    bzero(buffer , 256); 

    if((fp = fopen("received.txt" , "w")) != NULL) { 
    while((n = read(newsockfd , buffer , 255)) != 0) { 

     int i = 0; 
     for(i = 0 ; i < 255 ; i++) { 
     if(buffer[i] != '\0') 
      fputc(buffer[i] , fp); 
     } 

     //Create a new thread to read the file and print the results 
     if(!thread_Created) { 
     pthread_create(&thread , NULL , printData , NULL); 
     thread_Created = 1; 
     } 

    } 
    } 

    fclose(fp); 

    /* while(pthread_kill(thread , 0) == 0) { */ 
    /* } */ 
} 
+0

한 파일을 동시에 읽고 쓰지 마십시오. 적어도 뮤텍스를 사용하여 직렬화하십시오. https://computing.llnl.gov/tutorials/pthreads/ –

+0

흠, 뮤텍스를 사용하는 방법을 모르겠다. – feluna

답변

2
  1. 사용 뮤텍스 "활성 쓰기 섹션"잠그기
  2. 파일 IO에 멀티플렉싱을 사용합니다. 풀 또는 epol 참조, Linux 시스템 호출 선택
+0

좋아, 나는 그들을 배우고 시도 할 것이다. 답변 주셔서 감사합니다. – feluna

+0

여기에 게시 할 내용이 있다면 여기에 몇 가지 예를 들려 줄 수 있습니다. 그러나이 예제를 HDD (rofl)의 "garbage"에서 검색 할 시간이 필요합니다. – Maxim

+0

http : // advancedlinuxprogramming .com/또는 http://basepath.com/aup/ –

관련 문제