linux系统编程之管道(二):管道读写规则
linux系统编程之管道(二):管道读写规则
一,管道读写规则
当没有数据可读时
- O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。
- O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。
当管道满的时候
- O_NONBLOCK disable: write调用阻塞,直到有进程读走数据
- O_NONBLOCK enable:调用返回-1,errno值为EAGAIN
如果所有管道写端对应的文件描述符被关闭,则read返回0
如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE
当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。
当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。
二,验证示例
示例一:O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。
#include <stdio.h><unistd.h><stdlib.h><fcntl.h>
main( fds[(pipe(fds) == -=(pid == -(pid == ]);
sleep(],,]);
buf[] = {],buf,
结果:
<unistd.h><stdlib.h><fcntl.h>
main( fds[(pipe(fds) == -=(pid == -(pid == ]);
sleep(],,]);
buf[] = { flags = fcntl(fds[], F_GETFL);
fcntl(fds[],F_SETFL,flags | O_NONBLOCK);
= read(fds[],buf,(ret == -
结果: <unistd.h><stdlib.h><fcntl.h>
main( fds[(pipe(fds) == -=(pid == -(pid == ]);
]);
buf[] = {= read(fds[],buf,
结果: <unistd.h><stdlib.h><fcntl.h><signal.h>
sighandler( main( fds[(signal(SIGPIPE,sighandler) ==(pipe(fds) == -=(pid == -(pid == ]);
]);
sleep();
= write(fds[],,(ret == - sighandler(
结果: <unistd.h><stdlib.h><fcntl.h>
main( fds[(pipe(fds) == - count = (= write(fds[],,);
(ret == -++
结果: <unistd.h><stdlib.h><fcntl.h>
main( fds[(pipe(fds) == -