ããããããã°ãæ¸ãã¦ããªãã¨æã£ããä»å¹´ã«å
¥ã£ã¦ããæ´æ°ããã¦ããªãã£ã。
è¦ãã¦ããé¨åããã¨ããããæ°ãã¤ãããã¨ãã¡ã¢ãã¦ãããã¨æã。
ä»å㯠pipe 㨠fd ã®ãã©ã°ã«ã¤ãã¦。
Linux ã»ã *nix ã®ã·ã¹ãã ã§ã¯
ãã®ãã¤ãã® fd ã«ã¯
ã¤ã¾ã,ãã¤ãã¯ãã³ããããã³ã°ã«èªãã。
æå ã® ArchLinux 㧠Linux 4.12,glibc 2.25 ã使ã£ã¦ãã¨ããã©ã«ãã§ãã®ãã©ã°ãç«ã£ã¦ãã£ã½ãã¦äºæ³ãã¦ãªãæåã«æ°ãã¤ããªãã¦ããã£ã。
ãã©ã°ã®ç¢ºèªæ¹æ³ã¯,
éã«ãã©ã°ãã»ãããããªãã°,
ãã©ã°ã®æ¶å»ãã¾ãåæ§。
ãã®å ´å,fd ã
ãªã®ã§,
ãã®å ´å,
ãã ,ãã®ä¾ã®ããã« continue ããã ããªãããããèªã¿åºãã§ãããã¯ããã¨ãã°è¯ãã®ã§,å ãããã©ã°ãæ¶ãã¦ããã°æ¸ã話ã§ãã。
ããã«æ°ãã¤ããã«ããã¨ãããã¾ãã。
è¦ãã¦ããé¨åããã¨ããããæ°ãã¤ãããã¨ãã¡ã¢ãã¦ãããã¨æã。
ä»å㯠pipe 㨠fd ã®ãã©ã°ã«ã¤ãã¦。
Linux ã»ã *nix ã®ã·ã¹ãã ã§ã¯
pipe(2)
ã¨ããã·ã¹ãã ã³ã¼ã«ã§ããã»ã¹ééä¿¡ç¨ã® fd ãä½æã§ãã。ãã®ãã¤ãã® fd ã«ã¯
O_NONBLOCK
ã¨ãããã©ã°ãç«ã¦ããæ¶ããããããã¨ãå¯è½ã§ãã。ã¤ã¾ã,ãã¤ãã¯ãã³ããããã³ã°ã«èªãã。
æå ã® ArchLinux 㧠Linux 4.12,glibc 2.25 ã使ã£ã¦ãã¨ããã©ã«ãã§ãã®ãã©ã°ãç«ã£ã¦ãã£ã½ãã¦äºæ³ãã¦ãªãæåã«æ°ãã¤ããªãã¦ããã£ã。
ãã©ã°ã®ç¢ºèªæ¹æ³ã¯,
#inlude <fcntl.h>ãã®è¿å´å¤ã調ã¹ãã°è¯ã。
...
fcntl( fd, F_GETFL );
éã«ãã©ã°ãã»ãããããªãã°,
#include <fcntl.h>ã®ããã«åå¾ãããã©ã°ã«ç«ã¦ãããã©ã°ã追å ããã°è¯ã。
...
fcntl( fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK );
ãã©ã°ã®æ¶å»ãã¾ãåæ§。
O_NONBLOCK
ãç«ã¦ããã¦ããå ´åã«ã¤ãã¦。ãã®å ´å,fd ã
read(2)
ã§èªãã¨,ã¾ã ä½ããã¼ã¿ãå°çãã¦ããªãå ´å,read(2)
㯠-1 ãè¿å´ãã。ãªã®ã§,
while( read( fd, buf, sizeof(buf) ) > 0 ) {ãªã©ã¨ããææãã³ã¼ããæ¸ãã¦ããã¨
...
read(2)
ã¯ãããã¯ããªãã®ã§ä½ãèªã¾ãã«çµãããã¨ããã。ãã®å ´å,
for(;;) {ã¨ãã風ã«
ssize_t read_size = read( fd, buf, sizeof(buf) );
if ( read_size < 0 ) {
if ( errno == EAGAIN ) { continue; }
else { break; }
} else {
...
read(2)
ã®è¿å´å¤ãæ£ã®å¤ãããªãå ´åãã¤errno
ã«EAGAIN
ãå
¥ã£ã¦ããå ´åããã¡ãã¨ãã©ãã¼ãã¾ããã。ãã ,ãã®ä¾ã®ããã« continue ããã ããªãããããèªã¿åºãã§ãããã¯ããã¨ãã°è¯ãã®ã§,å ãããã©ã°ãæ¶ãã¦ããã°æ¸ã話ã§ãã。
ããã«æ°ãã¤ããã«ããã¨ãããã¾ãã。