¡¡¡¡¹ÜµÀ±íÏÖµÃÏñÆÕͨµÄÎļþÃèÊö·ûÒ»Ñù¡£Èç²»½øÐÐͨÐÅ£¬ÄãÎÞ·¨ÖªµÀÒ»¸öÎļþÃèÊö·ûÊÇÒ»¸öÎļþ»¹ÊÇÒ»¸ö¹ÜµÀ¡£ÕâÊÇÒ»¸öÌØÕ÷£»¶Á±ê×¼ÊäÈëºÍд±ê×¼Êä³öµÄ³ÌÐò²»ÐèÒªÖªµÀ»ò¹ØÐÄËüÃÇÊÇ·ñÔÚÓëÆäËûµÄ½ø³Ì½øÐÐͨÐÅ¡£Èç¹ûÄãÏëÖªµÀ£¬±È½Ï¹æ·¶µÄ¼ì²é·½Ê½ÊǶÔÎļþÃèÊö·ûµ÷Óá®lseek(fd,0,SEEK_CUR)¡¯£»Õâ¸öµ÷ÓÃÊÔͼÓɵ±Ç°Î»ÖÃËÑË÷0¸ö×Ö½Ú£¬Ò²¾ÍÊÇ˵£¬ÕâÊÇÒ»¸öʲôҲû×öµÄ²Ù×÷¡£Í¨³££¬ÕâÑùµÄ²Ù×÷½Ð×öno-op£¬¼´¡°no operation¡±µÄËõд¡£µ«ÊÇ£¬Ê²Ã´Ò²Ã»×ö£¬²»µÈÓÚʲô½á¹ûÒ²²»²úÉú£¨²»È»£¬ÎÒÃÇÕâôµÄÒâÒåºÎÔÚ£¿£©£¬¶ÔÓڹܵÀ£¬¸Ã²Ù×÷»áʧ°Ü£¬¶ø¶ÔÓÚÆäËûÎļþÒ²²»»áÔì³ÉÈκÎË𻵡£ÕâËƺõÊÇ´ÏÃ÷µÄ³ÌÐòÔ±¾³£ÍæË£µÄÒ»¸ö°ÑÏ·£¬»¹¼ÇµÃÔÚдIntel X86ÉϵĻã±àÂð£¿AND AX,AX ͬÑù¿´ËÆʲôҲû×ö£¬¿ÉÊÇËüÈ´Äܹ»°Ñ±ê־λ¸øÖÃÆðÀ´£¬´Ó¶ø¿ÉÒÔ»ñµÃAXÕâ¸ö¼Ä´æÆ÷ÖеÄÊýµÄºÜ¶àÌØÕ÷¡£
¡¡¡¡ÏµÍ³µ÷ÓÃpipe()ÓÃÓÚ´´½¨¹ÜµÀ£º
¡¡¡¡#include
¡¡¡¡int pipe(int filedes[2]);
¡¡¡¡ÆäÖеIJÎÊýÖµÊÇÒ»¸ö2ÔªËصÄÕûÊýÊý×éµÄµØÖ·¡£pipe()³É¹¦Ê±·µ»Ø0£¬ºÍÆäËû¾ø´ó¶àÊý±ê×¼POSIXÒ»Ñù£¬³ö´íʱ·µ»Ø-1.
¡¡¡¡Èç¹ûµ÷Óóɹ¦£¬Ôò½ø³Ì´ËʱÓÐÁËÁ½¸ö¶îÍâµÄ´ò¿ªÎļþÃèÊö·û¡£filedes[0]ÖеÄÖµÊǹܵÀµÄ¶ÁÈ¡¶Ë£¨read end£©£¬¶øfiledes[1]ÊǹܵÀµÄдÈë¶Ë£¨writer end£©£¨Ò»ÖÖ·½±ãµÄ¼ÇÒ䷽ʽÊǶÁÈ¡¶ËʹÓÃË÷Òý0£¬ÀàËÆÓÚ±ê×¼ÊäÈëµÄÎļþÃèÊö·û0£¨stdin£©£¬¶øдÈë¶ËʹÓÃË÷Òý1£¬Í¬ÑùÀàËÆÓÚ±ê×¼Êä³öµÄÎļþÃèÊö·û1£¨stdout£©£©¡£
¡¡¡¡ÕýÈçÇ°ÃæËùÌáµ½µÄ£¬Ð´ÈëдÈë¶ËµÄÊý¾ÝÄܹ»ÔÚ¶ÁÈ¡¶Ë½øÐжÁÈ¡¡£´¦ÀíÍê¹ÜµÀµÄʱºò£¬µ÷ÓÃclose()½«Á½¶Ë¹Ø±Õ¡£ÏÂÃæÕâ¸ö¼òµ¥µÄ³ÌÐòÑÝʾÁËÈçºÎ´´½¨¹ÜµÀ¡¢ÏòÆäÖÐдÈëÊý¾Ý²¢´ÓÖжÁÈ¡Êý¾Ý£º
ÒýÓÃ:#include
#include
#include
int main(int argc,char**argv)
{
static const char mesg[]="Jimmy Chen";
char buf[BUFSIZE];
ssize_t rcount,wcount;
int pipefd[2];
size_t l;
if(pipe(pipefd)<0){
fprintf(stderr,"%s:pipe failed:%s\n",argv[0],strerror(errno));
exit(1);
}
printf("Read end = fd %d, write end = fd %d\n",pipefd[0],pipefd[1]);
l=strlen(mesg);
if((wcount=write(pipefd[1],mesg,1))!=1){
fprintf(stderr,"%s:write failed:%s\n",argv[0],strerror(errno));
exit(1);
}
if((rcount=read(pipefd[0],buf,BUFSIZE))!=wcount){
fprintf(stderr,"%s:read failed:%s\n",argv[0],strerror(errno));
exit(1);
}
buf[rcount]='\0';
printf("Read <%s> from pipe\n",buf);
close(pipefd[0]);close(pipefd[1]);
return 0;
}
¡¡¡¡Ê×ÏÈÉùÃ÷ÁËһЩ¾Ö²¿±äÁ¿£¬×îÁîÈ˸ÐÐËȤµÄÊÇmesg£¬ËüÊǾ¹ÜµÀ´«ÊäµÄÎı¾¡£½ÓÏÂÈ¥´´½¨ÁËÒ»¸ö¹ÜµÀ£¬Í¬Ê±½øÐдíÎó¼ì²é¡£ÔÙ½ÓÏÂÈ¥¾ÍÊǶԹܵÀµÄ¶ÁÓëдÁË£¬Í¬Ê±½øÐдíÎó¼ì²é¡£
¡¡¡¡Õâ¸ö³ÌÐòûÓÐÓÐÓõŦÄÜ£¬µ«ÊÇËüȷʵÑÝʾÁË»ù±¾µÄ¸ÅÄî¡£×¢ÒâûÓе÷ÓÃopen()»òÕßcreat()£¬¶ø³ÌÐòҲûÓÐʹÓÃËüËù¼Ì³ÐµÄ3¸öÎļþÃèÊö·û¡£µ«ÊÇ£¬write()ºÍread()ÒÀÈ»Äܹ»µ÷Óóɹ¦£¬Õâ¾ÍÖ¤Ã÷ÁËÎļþÃèÊö·ûÊÇÓÐЧµÄ£¬¶ø½øÈë¹ÜµÀµÄÊý¾ÝȷʵÄܹ»±»Êä³ö¡£µ±È»£¬Èç¹ûÏûϢ̫´ó£¬ÔòÎÒÃǵijÌÐò¾Í»áÎÞ·¨Õý³£ÔËÐС£ÕâÊÇÒòΪ¹ÜµÀµÄ¿Õ¼ä¾ÍÊÇÄÇôС¡£
¡¡¡¡ÓëÆäËüµÄÎļþÃèÊö·ûÏàͬ£¬µ÷ÓÃfork()Ö®ºó£¬Èç¹û¹ÜµÀδ¹Ø±Õ£¬Ôò¹ÜµÀµÄÎļþÃèÊö·û¿ÉÒÔÓÉ×Ó½ø³Ì¼Ì³Ð£¬¶øÇÒµ÷ÓÃexec()Ö®ºó¸ÃÃèÊö·ûÒÀÈ»¿ÉÓá£
¡¡¡¡ÏÂÃæÔÙ½éÉÜһϻº³å¹ÜµÀ¡£
¡¡¡¡»º³åÎÞ´¦²»ÔÚ¡£ºÍг²¢²»ÊÇÊÂÎïµÄ×ÔȻ״̬£¬¶ø»º³åÔòʹµÃºÍг³ÉΪ¿ÉÄÜ¡£
¡¡¡¡¹ÜµÀ»º³åÆäÊý¾Ý£¬ÕâÒâζ×ÅдÈë¹ÜµÀµÄÊý¾ÝÓÉÄں˱£´æÖ±µ½ÕâЩÊý¾Ý±»¶ÁÈ¡¡£µ«ÊÇ£¬Ò»¸ö¹ÜµÀ½öÄܹ»±£´æÊÊÁ¿µÄдÈëÇÒÈÔδ¶ÁÈ¡µÄÊý¾Ý¡£ÎÒÃÇ¿ÉÒÔ½«Ð´Èë½ø³Ì³ÉΪÉú²úÕߣ¨producer£©£¬½«¶ÁÈ¡½ø³Ì³ÉΪÏû·ÑÕߣ¨consumer£©¡£ÏµÍ³ÈçºÎ¹ÜÀí¿ÕÏкͳäÂúµÄ¹ÜµÀÄØ£¿
¡¡¡¡µ±¹ÜµÀ³äÂúʱ£¬ÏµÍ³×Ô¶¯×èÈûÉú²úÕßÏ´ÎÊÔͼʹÓÃwrite()дÈëÊý¾Ýµ½¹ÜµÀÖС£Ò»µ©¹ÜµÀÇå¿Õ£¬ÏµÍ³½«Êý¾Ý¿½Èë¹ÜµÀ£¬²¢ÔÊÐíϵͳµ÷ÓÃwrite()·µ»Ø¸øÉú²úÕß¡£
¡¡¡¡ÀàËƵģ¬Èç¹û¹ÜµÀ¿ÕÏУ¬ÔòÏû·ÑÕßÔÚµ÷ÓÃread()µÄʱºò¾Í»á×èÈû£¬Ö±µ½¹ÜµÀÖÐÓиü¶à¿É¶ÁÈ¡µÄÊý¾Ý£¨×èÈû»úÖÆ¿ÉÒԹرգ¬Õâ¸öÎÒÃÇÒÔºóÔÙ̸£©¡£
¡¡¡¡µ±Éú²úÕ߶ԹܵÀµÄдÈë¶Ëµ÷ÓÃclose()ʱ£¬Ïû·ÑÕßÈÔÄܹ»³É¹¦µØ¶ÁÈ¡ÒÀÈ»»º³åÔڹܵÀÖеÄÊý¾Ý¡£Íê³ÉÖ®ºóÔÙµ÷ÓÃread()ʱ·µ»Ø0£¬±íÃ÷Îļþ½áÊø¡£
¡¡¡¡Ïà·´£¬Èç¹ûÏû·ÑÕ߹رնÁÈ¡¶Ë£¬Ôò¶ÔдÈë¶ËµÄwrite()µ÷Óý«»áʧ°Ü----³¹µ×ʧ°Ü¡£ÌرðµÄ£¬Äں˸øÉú²úÕß·¢ËÍ¡°ÖжϵĹܵÀ£¨broken pipe£©¡±Ðźţ¬ÆäĬÈ϶¯×÷Êǹرոýø³Ì¡£
¡¡¡¡±¾ÎÄÖ÷Òª²Î¿¼ÁËArnold RobbinsµÄ¡¶Linux Programming by Example¡·