Le 22/03/16 18:43, Garrett D'Amore a écrit : > Running head on /dev/zero is … wrong. Arguably without -c it should loop > forever until it crashes due to malloc() failure, or it should copy an > infinite sequence of zero bytes because it never reaches a newline. > > The problem is that zero is a special character (end of string) — its unclear > to me what the correct behavior here should be. What happens if you embed > zero bytes in a file? > > Note that in POSIX, head lacks -c, so the behavior is not part of any > standard. > > I *think* the “right” answer here is that NUL should be treated like any > other character, which precludes the use of normal C string handling > functions in head. Even fgets(3C) and getline(3C) cannot be used. > > Seriously, head and copy are for use in text files, not with arbitrary binary > data files, and so their handling (or mishandling) of binary data should not > come as a surprise. > > That said, on BSD (Darwin) head -c 1 copies a single zero byte. head without > -c just returns an error. (Not sure what the error is, because I can’t > dtruss it in new Darwin. Thanks Apple.) > > - Garrett >
Well, 'man' does say that it copies 'n' bytes, not characters. I can dd a byte from /dev/zero and head -c 1 now returns but it seems still buggy... Truss shows it reads twice: > open64("/tmp/fooz", O_RDONLY) = 3 > fstat64(3, 0x08047570) = 0 > fstat64(3, 0x08047470) = 0 > ioctl(3, TCGETA, 0x0804752E) Err#25 ENOTTY > read(3, "\0", 4096) = 1 > read(3, 0x0806346C, 4096) = 0 > ioctl(1, TCGETA, 0x080467BE) = 0 > fstat64(1, 0x08046700) = 0 > read(3, 0x0806346C, 4096) = 0 > llseek(3, 0, SEEK_CUR) = 1 > _exit(0) and if I try to do a 'wc -c' > $ head -c 1 /tmp/fooz |wc -c > 0 > $ sh -c 'head -c 1 /tmp/fooz |wc -c' > 1 > $ ghead -c 1 /tmp/fooz |wc -c > 1 just to compare to gnu head and sh builtin -- Richard PALO ------------------------------------------- illumos-discuss Archives: https://www.listbox.com/member/archive/182180/=now RSS Feed: https://www.listbox.com/member/archive/rss/182180/21175430-2e6923be Modify Your Subscription: https://www.listbox.com/member/?member_id=21175430&id_secret=21175430-6a77cda4 Powered by Listbox: http://www.listbox.com