2015-01-18 4 views
0

) file1의 내용을 fifo를 통해 다른 file2에 복사하려고합니다. FIFO에서 다시 쓰고 싶을 처음 네 글자 (file1에서 fifo로 내용을 쓸 때 이전에는 읽는 동안이 아니라). 그리고 나서 file2에도 복사합니다. 그러나 처음 네 글자는 뒤에 붙지 않지만 중간에 무작위로 삽입됩니다. 터미널에, 내가 실행하면 내가 b.txt하는 a.txt이 복사 할FIFO에서 동시에 읽고 쓰기 (

$ ./a.out a.txt이

b.txt 내 코드는 지금

int main(int argc, char* argv[]) { 

    int fdes,fdes1; 
    pid_t pid; 
    ssize_t numRead; 

    char readBuff[1]; 
    char writeBuff[1]; 
    int readCounter; 
    int c=0; 

    umask(0); 

    if (mkfifo("ajjp.e",0666) == -1 /*make the fifo*/ 
     && errno != EEXIST) 
    {} 

    if(argc < 3) { 
     printf("Atleast need 2 params "); 
     exit(1); 
    } 

    int to_copy = open(argv[1], 0);/* file from which contents are to be copied */ 
    int oo = creat(argv[2], 0666);/* file created where we've to write contents*/ 

    if (to_copy == -1 ) { 
     printf("Opening file failed "); 
     exit(1); 
    } 
    if ((pid = fork()) < 0) /* child process is made*/ 
     perror("fork error"); 

    /* in parent process,I'm cwriting contents of file1 to fifo character by character */ 
    else if(pid>0) 
    { 
     fdes = open("ajjp.e", O_WRONLY); 
     while((readCounter = read(to_copy, readBuff, sizeof(readBuff)) > 0)) { 

      write(fdes, readBuff, sizeof(readBuff)); 
     } 
     close(to_copy); 

    } 
/* now, in child process, I opened its read end then I'm reading contents from fifo and writing it to file2(i.e copy_to here) but for first four characters(c< 5 here), I'm writing them to fifo also by opening its write end. */ 
    else 
    { 
     fdes1 = open("ajjp.e", O_RDONLY); 

     fdes = open("ajjp.e", O_WRONLY); 

     if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) 
      printf("signal"); 

     int copy_to = open(argv[2], 0666);/* opened the file where we've to write*/ 
     if (copy_to == -1 ) { 
      printf("Opening file failed "); 
      exit(1); 
     } 


     for(;;) { 

      c++; 
      numRead = read(fdes1, readBuff, sizeof(readBuff));/* reading from read end of fifo*/ 

      if (numRead == 0) 
       break; 

      /* write to the file2*/ 
      if (write(copy_to, readBuff, numRead) != numRead) 
      {} 
      /* for first 4 characters, I am rewriting to the back of fifo*/ 
      if(c<5) 
      { 
       write(fdes,readBuff,sizeof(readBuff)); 
      } 
      /*after writing those 4 characters, write end I've closed*/ 
      if(c==5) 
       close(fdes); 
     } 
     close(fdes); 
     close(fdes1); 

    }//end else 

    return 0;  
} 

입니다 b.txt에는 a.txt와 문자 사이에 임의로 삽입 된 처음 4자를 포함합니다.

+0

코드 서식을 지정할 수 있습니까? 현재 진행되고있는 일을 이해하는 것은 정말 어렵습니다. – marko

+0

몇 가지 의견을 추가했습니다. 아직 해독 할 수 없다면 알려주세요. –

+0

@marko, 실제로 나는 fork()를 사용할시기와 사용할지 여부를 알지 못합니다. 또한 FIFO는 다른 프로세스가 쓰기를 위해 열지 않을 때까지 끝 블록을 읽습니다. 그 반대의 경우도 마찬가지입니다. 그래서, 나는 두 프로세스 (자식과 부모)가 읽기와 쓰기를 수행 할 수 있도록 자식 프로세스를 생성하려고 생각했다. 그러나 나는 자식 과정에서 나는 둘 다 읽고 쓰고 있다는 것을 알지 못합니다. –

답변

0

일부 논리 문제와 동기화 문제가 있습니다. 목표는 너무 명확하지 않지만 "Hello World"라고 말한 파일을 복사하고 "Hello World"가 있어야하며 "Hell"을 뿌려야하는 것처럼 보입니다. 그래서, 아마도 "HelHleo llWorld "?

컴퓨터가 빠르며 한 번에 많은 양을 버퍼링하고 처리 할 수 ​​있습니다. 새 프로세스를 시작하는 데 약간의 시간이 걸리기 때문에 부모 프로세스가 완료된 후에야 자식 프로세스가 실행됩니다. 따라서 당신은 아마도 "Hello WorldHell"을 얻고있을 것입니다. 즉, 부모는 파일을 FIFO로 완전히 복사하기 전에 파일을 읽기 시작합니다. 몇 가지 동기화 방법을 조사해야합니다. 예를 들어 도구를 사용하여 다른 FIFO를 만들 수 있습니다. 부모가 읽을 수있을 때까지 기다리십시오. 그것이 준비가되어 있다고 부모에게 알리는 방법으로 적재 될 때 아이에게 그것에 글을 씁니다. 파일을 정말 크게 만드는 것은 자식에게 각 문자 뒤에 sleep 문을 시작하거나 추가 할 시간을 줄 수도 있습니다.

입력 파일과 출력 (잘못된 출력)을 제공했다면 쉽게 추측 할 수 있습니다. 하지만 기본적으로 다중 프로세스/멀티 스레딩 문제는 함께 작동하기를 원하지만 실제로는 한 번에 하나씩 실행됩니다. 부모를 천천히하거나 아이를 기다립니다.