Re: PROPOSAL: extend pipe() to support NULL argument.

From: Changli Gao
Date: Thu Jul 02 2009 - 20:43:48 EST


On Thu, Jul 2, 2009 at 6:21 PM, Amerigo Wang<xiyou.wangcong@xxxxxxxxx> wrote:
> On Thu, Jul 02, 2009 at 06:04:02PM +0800, Changli Gao wrote:
>>On Thu, Jul 2, 2009 at 5:46 PM, Amerigo Wang<xiyou.wangcong@xxxxxxxxx> wrote:
>>>>Are you familiar with splice() and tee()? They both use pipes as kernel buffers.
>>>
>>> You are not answering the question, obviously.
>>When you use pipes as kernel buffer handlers, two fd isn't necessary.
>>Using one will save half of fd resources. Is it obviously?
>
> Not really.. I can't see any reason why you use this method to save
> fd's... pick read(2)/write(2).
In order to use splice, you must have pipe first. The common code is:

int fd[2];

pipe(fd);
splice(infd, NULL, fd[1], NULL, getpagesize(), SPLICE_F_MOVE);
splice(fd[0], NULL, outfd, NULL, getpagesize(), SPLICE_F_MOVE);
close(fd[0]);
close(fd[1]);

if pipe supports NULL argument, and returnes a RW pipe fd in that
case, the code will become:

int fd;

fd = pipe(NULL);
splice(infd, NULL, fd, NULL, getpagesize(), SPLICE_F_MOVE);
splice(fd, NULL, outfd, NULL, getpagesize(), SPLICE_F_MOVE);
close(fd);

One fd is saved.

>
>>
>>>
>>> And you snipped too much, how can you return that fd? Using the return value?
>>one RW file descriptor is returned. I have answered this in the first post.
>
> No, you never say *how* it is returned.
return value. save in %eax in i386.

>
>>
>>> Ah! This will probably break the user-space program...
>>>
>>I don't think so. As a skillful programmer, who will trasfter pipe() a
>>NULL pointer? In any way, it is break sth, but not very seriously, and
>>won't affact any right and robust program.
>
> Huh? Isn't the code sample below too common?
>
> if (pipe(...))
> Â perror("pipe");
>
> Currently pipe(2) can make sure this is robust.
>
> You are trying to break it...
>

It depends on the argument for pipe, if the argument is NULL, it
breaks the code above.



--
Regardsï
Changli Gao(xiaosuo@xxxxxxxxx)
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/