문제

나는 명명 된 파이프에서 데이터를 읽고/쓰고 있습니다. 글쓰기 측면에서는 일정한 110 바이트를 쓰고 있다고 말합니다. 대부분의 시간 동안 읽기 측면에서는 110 바이트를 읽는 것이 정확하지만 다른 경우에는 220 바이트 또는 330 바이트가 표시됩니다. 인쇄 할 때 동일한 메시지 () 내에서 동일한 메시지를 2 ~ 3 회 연속으로 인쇄한다는 사실에서 옳습니다. 읽기를위한 아래 코드에서 나는 숯을 청소하기 위해 밈 세트에 뭔가 잘못하고 있습니까? 버퍼에 무언가가 남아 있지 않으면 더 많이 읽는 다른 방법을 생각할 수 없습니다.

int fd1, numread;
char bufpipe[5000];

    while(1)
    {
        fd1 = open("/tmp/testPipe", O_RDONLY);
        numread = read(fd1,bufpipe, 5000);//->this should always be 110
        if(numread > 1)
        {
            printf("READ: %i", numread); 
            bufpipe[numread+1] = '\0';
            memset(bufpipe,'\0',5001);
            close(fd1);
        }
    }
도움이 되었습니까?

해결책

이것:

memset(bufpipe,'\0',5001);

5000 바이트 만 있기 때문에 하나의 바이트로 덮어 쓰고 있습니다.

그러나 주요 "문제"는 그 것입니다 read(..., 5000) 항상 최대 5000 바이트까지 읽을 수있는만큼 읽을 것입니다. 작가가 한 번에 쓰여진만큼만 읽을 것이라고 가정하는 것 같습니다. 작가가 두 개의 읽기 사이에 110 바이트의 2 개의 패킷을 쓰면 독자가 220 바이트를 읽는 것이 정확합니다.

한 번에 단일 패킷 만 읽어야하는 경우 패킷을 자체 설명해야합니다. 예를 들어, 처음 4 바이트에는 따라야 할 바이트 수가 포함되어 있습니다. 그런 다음 4 바이트를 읽고 정수로 변환 한 다음 해당 수의 데이터 바이트를 읽음으로써 단일 패킷을 읽을 수 있습니다.

다른 팁

당신의 가정은 a read a 직후에 실행됩니다 write 사실이 아닙니다. 작가 과정은 읽기가 발생하기 전에 파이프에 몇 번 쓸 수 있습니다. 서면 데이터는 버퍼 끝에 추가됩니다. 다르게 말하면 읽기 및 쓰기는 패킷 지향적이지 않습니다. 그들은 스트림 지향적입니다. 그것은 의미합니다 write 버퍼에 데이터를 추가합니다 read 이용할 수있는 모든 것을 얻을 수 있습니다.

작가와 어떻게 동기화하고 있습니까? 당신은 당신의 기대를 읽어야합니다 (읽기 위해 110을 지정하십시오 ())

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top