On Wed, 2008-07-30 at 18:53 +0200, Michael Haubenwallner wrote:
<snip>
> Now I can see (stripped the unimportant):
>         open("GetWMCMapW.loT", O_WRONLY|O_CREAT|O_APPEND|O_LARGEFILE) = 4
>         kfcntl(4, 14, 0x00000001)       = 1
>         close(4)                = 0
>         open("/tmp//sh-thd-1217607265", 
> O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_LARGEFILE) = 4
>         kfcntl(4, F_DUPFD, 0x00000000)      = 5
>         kwrite(5, " p i c _ o b j e c t = '".., 32) = 32
>         close(5)                = 0
>         open("/tmp//sh-thd-1217607265", O_RDONLY|O_LARGEFILE) = 5
>         close(4)                = 0
>         unlink("/tmp//sh-thd-1217607265")   = 0
>         kfcntl(5, 14, 0x00000000)       = 0
>         close(5)                = 0
>         execve("/usr/bin/cat", 0x200234E8, 0x20026968)  argc: 1
>          argv: cat
>         kread(0, " p i c _ o b j e c t = '".., 4096) = 32
>         kwrite(1, " p i c _ o b j e c t = '".., 32) = 32
>         kread(0, " p i c _ o b j e c t = '".., 4096) = 0
>         close(1)                = 0
>         _exit(0)
> 
> So I'm sure the missing commands above _are_ executed.
> 
> 
> My speculation:
> 1) bash opens the here-document twice, first O_WRONLY, second O_RDONLY,
> dup2'ing the second handle to stdin before doing exec('cat'), removing
> the file immediately after the second open.
> 
> 2) ksh opens the here-document only once, with O_RDWR, and dup's that
> handle to stdin before doing exec('cat'), removing the file immediately
> after the open.

Forgot to mention that ksh does fseek() to zero before exec("cat").

> 
> Could one think of: when opening the file the second time, the content
> of the first write isn't on-disk yet (because the content might fit into
> some aix write buffer), or already removed by someone else in the
> meantime, or something like that?

Sorry, I've been wrong here: "cat" actually _can_ read the content, so
the double-open is not the problem here. Although IMHO it still might be
better for security and performance reasons to open() only once, and
fseek() to zero like ksh does.

/haubi/
-- 
Michael Haubenwallner
Gentoo on a different level



Reply via email to