2014-10-28 6 views
0

나는 USB와 상호 작용하는 내 프로그램의 strace를 가지고 있으며, 다음의 쓰기 명령이 나에게 무엇을 말하고 있는지 궁금합니다. writev iovec 구조는 데이터 배열 포인터 뒤에 길이가 오는 것으로 이해하지만 데이터 배열의 "@\10\335 \320\2w\4\240K\252\0\7"은 무엇을 나타 냅니까? 저는 특히 @ 기호, 2w 및 240K가 16 진수 데이터 값이 아니므로 그 기호를 기대할 수 있습니다. man page of writev에서Linux에서 writev() 함수를 사용하는 Strace는 '@', '2w'및 '240K'는 데이터에서 무엇을 나타내는가?

writev(6, [{"@\10\335 \320\2w\4\240K\252\0\7", 13}, {"\0\0\0\4\0\0\0\4", 8}], 2) = 21 
+1

"@"은 "@"입니다. "2w"는 2 바이트 "\ 2w"의 일부입니다. "240K"는 2 바이트 "\ 240K"의 일부입니다. –

+0

@ IgnacioVazquez-Abrams, 그래서 그것은 단지 직접 ASCII 번역입니까? – ryeager

+0

인쇄 가능한 ASCII로되어있는 부분에 대해서는. –

답변

3

:

입니다
ssize_t readv(int fd, const struct iovec *iov, int iovcnt); 

, 두 번째 인수는 크기의 값의 배열 인 내가 여기 리눅스에서 실행하고있어

는 writev는 라인이다 세 번째 인수 (2 귀하의 경우) struct iovec 유형의 요소.

strace이 인쇄 할 때 8 진수은 인쇄 할 수없는 문자를 이스케이프 처리하지만 인쇄 할 수있는 그대로 표시합니다. 따라서 @@에 해당하는 바이트이며 KK에 해당하는 바이트입니다.


코멘트에있는 당신의 질문에 응답의 man page 또 다른 모습 {"@\10\335 \320\2w\4\240K\252\0\7", 13}@\10\335 \320\2w\4\240K\252\0\7로 인쇄 바이트를 포함하는 메모리 영역이 iov_len = 13iov_base로 읽을 수 있다는 것을 의미

struct iovec { 
    void *iov_base; /* Starting address */ 
    size_t iov_len;  /* Number of bytes to transfer */ 
}; 

을 보여줍니다. 당신은 이진 값을보고 싶다면 gdb을 화재 :

[[email protected] 1]$ gdb -q 
(gdb) p/x "@\10\335 \320\2w\4\240K\252\0\7" 
$1 = {0x40, 0x8, 0xdd, 0x20, 0xd0, 0x2, 0x77, 0x4, 0xa0, 0x4b, 0xaa, 0x0, 0x7, 0x0} 

을 마지막 0x0 문자열의 null 종결 무시해야 경우.

+1

굉장한 @MihaiMaruseac, 내가 찾고 있었던 것에 대한 상세한 대답에 감사드립니다! – ryeager