2011-09-22 5 views
0

나는 C가 처음이므로 다음과 같은 행동으로 완전히 혼란 스럽다.read() 버퍼의 횡설수설?

n = read(fd[0], readbuffer, sizeof(readbuffer)); 
printf("received: %s", readbuffer); 

그러나, printf는 '사람들의 무리를 인쇄 : C에서 읽기 함수에 대한 호출을 통해

puts "success" 

: 나는 다음과 같은 사소한 루비 프로그램의 출력을 읽고있다 pipe()fork() 사용 인식 할 수없는 문자 '기호 (예 : 다이아몬드의 물음표)를 콘솔에 보냅니다. 또한 다음과 같은 비교를 수행하십시오.

if (strcmp(readbuffer, "success") == 0) 
    { 
     /* do something */ 
    } 

이 실패합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

편집 : 요청한대로 신고하십시오. 나는 memsetting에 대해 아무 생각, C.

나의 첫 날이 없다
int fd[2], in; 
pid_t pid; 
char readbuffer[6]; 

편집 :에 의해

대답 'MU가 너무 짧은'또한 문제를 해결한다. 합의는 memset을 사용하는 것이 과잉이라고 생각합니다. 나는 초보자 C 프로그래머이므로 주석가의 의견을 믿어야한다. 그러나 이것은 argumentum ad populum이며 mu가 너무 짧으면 실제로 오른쪽에 더 많을 수 있습니다. 어쨌든, 나는 두 가지 대답을 읽는 것을 권장합니다. '과잉 공격'은 아마도 그렇게 쉽게 일어날 수 있습니다.

+0

사용하기 전에 버퍼를'0'으로'memset' 했습니까? 그렇지 않으면 버퍼가 null로 종료되지 않고 쓰레기 값을 제공합니다. –

+0

readbuffer를 static 또는 global로 선언하면 0으로 초기화됩니다. – DigitalRoss

+0

선언과 함께 편집 된 readbuffer 및 fd –

답변

2

에 올렸 등

당신은 readbuffer을 선언, '당신의 버퍼는 당신이 읽고있는 텍스트를 저장하기에 충분히 큰되지 않습니다, 당신은 돈 그것이 null로 종료되었는지 확인하십시오.

그러나 각 읽기가 필요하기 전에 memset()을 사용하여 전체 버퍼를 0으로 설정하십시오. 당신은 단지 당신이 읽은 데이터의 끝에 null이 있다는 것을 보장 할 필요가있다. 당신이 readbuffer 적어도 9 자 확인하고 교체하는 경우

:

n = read(fd[0], readbuffer, sizeof(readbuffer)); 

..with .. (당신이 이상적으로 확인해야하지만 그것을해야

n = read(fd[0], readbuffer, sizeof(readbuffer) - 1); 
readbuffer[n] = '\0'; 

..then

이 성공했는지 확인하려면 n> = 0입니다. 읽기 버퍼의 크기보다 작은 값을 지정하면 readbuffer[n]이 오버런하지 않습니다 (단, read()이 실패하면 언더런 할 수 있음).

그러면 끝 부분에서 줄 바꿈을 처리해야합니다.

이것은 또한 하나의 읽기 호출에서 전체 문자열을 읽은 것으로 가정합니다. 이 경우 가능성이 있지만, 종종 충분한 양의 데이터를 읽을 때까지 여러 개의 읽기를 연결하는 데 필요한 읽기를 사용할 때.

1

주석 메모로 readbuffer에 널 종결자가 없으므로 실제로 C 문자열이 아닙니다. 당신은 이것을 할 수 있습니다 :

#include <string.h> 

/* ... */ 

memset(readbuffer, 0, sizeof(readbuffer)); 
n = read(fd[0], readbuffer, sizeof(readbuffer) - 1); 

그것은 당신에게 적절한 null로 끝나는 문자열을 줄 것입니다. 당신이 실제로 길이 6의 문자열을 원한다면, 다음 readbuffer의 선언 변경 : 당신이 한 번만 readbuffer 필요한 경우

char readbuffer[7]; 

을, 당신은 말할 수 :

char readbuffer[7] = { 0 }; 

가 초기화하기 모두 0. 그러나 루프에서 read을 수행하는 경우 각 read 앞에 memset(readbuffer, 0, sizeof(readbuffer))을 입력하고 마지막 단계의 남은 데이터로 끝나지 않도록해야합니다.

C가 로컬 변수를 자동으로 초기화하지 않으므로 직접해야합니다.

내가 알고있는 것처럼
+0

이것은 참으로 말도 안되는 문자를 없애 버렸지 만 지금 출력은 공백입니다 ... 루비에서 텍스트를받는 데 오류가 없음을 알고 있습니다. '실패'라고 '성공'을 변경하고 memset을 무시합니다. 다양한 말도 안되는 소리를. – providence

+1

'memset'은 잔인합니다. 데이터를 읽은 후에 하나의 터미네이터를 쓰거나''%. * s " '를 사용하여 데이터를 출력하지 않고 종료 할 수 있습니다. –

1

, 당신의 라인 (C-기준)

puts "success" 

출력됩니다 내가 9 개 문자로 계산

success\n\0 

. 다른 사람들이 지적으로 만 6. 이전의 대답은 7

+0

6은 오타였습니다. 나는 원래 당신이 지적한대로 7이 너무 적다. 나는이 숫자를 올렸다. 고마워. – providence