두 가지 버전의 서버/클라이언트 응용 프로그램이 있습니다. 첫 번째 클라이언트는 텍스트 파일을 읽고 서버에 텍스트 데이터를 보내고 서버는받은 텍스트 데이터를 새 텍스트 파일 ("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) { */
/* } */
}
한 파일을 동시에 읽고 쓰지 마십시오. 적어도 뮤텍스를 사용하여 직렬화하십시오. https://computing.llnl.gov/tutorials/pthreads/ –
흠, 뮤텍스를 사용하는 방법을 모르겠다. – feluna