我有两个方案,作者和读者。
我从作家到读者一个FIFO,所以当我写的东西在作家到标准输入,它会从阅读器打印到标准输出。
我试着用两个读卡器开这样做,并且我从只有两个阅读器程序的一个输出到标准输出。 其中Reader程序的Unix选择打印标准输出从每一个似乎我跑这一次是任意的,但一旦它选择的方案之一,每个输出到stdout会从同一Reader程序打印。
有谁知道为什么出现这种情况?
如果我有两个撰稿人节目,他们都写入到同一个管好。
我有两个方案,作者和读者。
我从作家到读者一个FIFO,所以当我写的东西在作家到标准输入,它会从阅读器打印到标准输出。
我试着用两个读卡器开这样做,并且我从只有两个阅读器程序的一个输出到标准输出。 其中Reader程序的Unix选择打印标准输出从每一个似乎我跑这一次是任意的,但一旦它选择的方案之一,每个输出到stdout会从同一Reader程序打印。
有谁知道为什么出现这种情况?
如果我有两个撰稿人节目,他们都写入到同一个管好。
在FIF 澳 O表示“出”。 一旦你的数据是“OUT”了,就不见了。 :-)如果另一个进程来临时,有人已发出的读那么自然,数据是不会在那里两次。
要做到你有什么建议,你应该考虑的Unix域套接字。 联机帮助这里 。 你可以写,可以写客户端进程,结合到文件系统路径的服务器。 另请参见socket()
bind()
listen()
accept()
connect()
所有这一切,你会想使用PF_UNIX
, AF_UNIX
和struct sockaddr_un
。
Linux的三通()可满足您的需求。
看到这里开球
注:此功能是Linux特有的。
我不认为你观察到的行为超过巧合。 考虑这一点痕迹,它采用“sed的”因为这两个读卡器和一个循环的作家:
Osiris JL: mkdir fifo
Osiris JL: cd fifo
Osiris JL: mkfifo fifo
Osiris JL: sed 's/^/1: /' < fifo &
[1] 4235
Osiris JL: sed 's/^/2: /' < fifo &
[2] 4237
Osiris JL: while read line ; do echo $line; done > fifo < /etc/passwd
1: ##
1: # User Database
1: #
1: # Note that this file is consulted directly only when the system is running
1: # in single-user mode. At other times this information is provided by
1: # Open Directory.
1: #
1: # This file will not be consulted for authentication unless the BSD local node
1: # is enabled via /Applications/Utilities/Directory Utility.app
1: #
1: # See the DirectoryService(8) man page for additional information about
1: # Open Directory.
1: ##
1: nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
1: root:*:0:0:System Administrator:/var/root:/bin/sh
1: daemon:*:1:1:System Services:/var/root:/usr/bin/false
1: _uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
1: _lp:*:26:26:Printing Services:/var/spool/cups:/usr/bin/false
2: _postfix:*:27:27:Postfix Mail Server:/var/spool/postfix:/usr/bin/false
2: _mcxalr:*:54:54:MCX AppLaunch:/var/empty:/usr/bin/false
2: _pcastagent:*:55:55:Podcast Producer Agent:/var/pcast/agent:/usr/bin/false
2: _pcastserver:*:56:56:Podcast Producer Server:/var/pcast/server:/usr/bin/false
2: _serialnumberd:*:58:58:Serial Number Daemon:/var/empty:/usr/bin/false
2: _devdocs:*:59:59:Developer Documentation:/var/empty:/usr/bin/false
2: _sandbox:*:60:60:Seatbelt:/var/empty:/usr/bin/false
2: _mdnsresponder:*:65:65:mDNSResponder:/var/empty:/usr/bin/false
2: _ard:*:67:67:Apple Remote Desktop:/var/empty:/usr/bin/false
2: _www:*:70:70:World Wide Web Server:/Library/WebServer:/usr/bin/false
2: _eppc:*:71:71:Apple Events User:/var/empty:/usr/bin/false
2: _cvs:*:72:72:CVS Server:/var/empty:/usr/bin/false
2: _svn:*:73:73:SVN Server:/var/empty:/usr/bin/false
2: _mysql:*:74:74:MySQL Server:/var/empty:/usr/bin/false
2: _sshd:*:75:75:sshd Privilege separation:/var/empty:/usr/bin/false
2: _qtss:*:76:76:QuickTime Streaming Server:/var/empty:/usr/bin/false
2: _cyrus:*:77:6:Cyrus Administrator:/var/imap:/usr/bin/false
2: _mailman:*:78:78:Mailman List Server:/var/empty:/usr/bin/false
2: _appserver:*:79:79:Application Server:/var/empty:/usr/bin/false
2: _clamav:*:82:82:ClamAV Daemon:/var/virusmails:/usr/bin/false
2: _amavisd:*:83:83:AMaViS Daemon:/var/virusmails:/usr/bin/false
2: _jabber:*:84:84:Jabber XMPP Server:/var/empty:/usr/bin/false
2: _xgridcontroller:*:85:85:Xgrid Controller:/var/xgrid/controller:/usr/bin/false
2: _xgridagent:*:86:86:Xgrid Agent:/var/xgrid/agent:/usr/bin/false
2: _appowner:*:87:87:Application Owner:/var/empty:/usr/bin/false
2: _windowserver:*:88:88:WindowServer:/var/empty:/usr/bin/false
2: _spotlight:*:89:89:Spotlight:/var/empty:/usr/bin/false
2: _tokend:*:91:91:Token Daemon:/var/empty:/usr/bin/false
2: _securityagent:*:92:92:SecurityAgent:/var/empty:/usr/bin/false
2: _calendar:*:93:93:Calendar:/var/empty:/usr/bin/false
2: _teamsserver:*:94:94:TeamsServer:/var/teamsserver:/usr/bin/false
2: _update_sharing:*:95:-2:Update Sharing:/var/empty:/usr/bin/false
2: _installer:*:96:-2:Installer:/var/empty:/usr/bin/false
2: _atsserver:*:97:97:ATS Server:/var/empty:/usr/bin/false
2: _unknown:*:99:99:Unknown User:/var/empty:/usr/bin/false
Osiris JL: jobs
[1]- Running sed 's/^/1: /' < fifo &
[2]+ Done sed 's/^/2: /' < fifo
Osiris JL: echo > fifo
1:
Osiris JL: jobs
[1]+ Done sed 's/^/1: /' < fifo
Osiris JL:
正如你所看到的,读者有阅读一些数据。 其中阅读器被安排在任何时间取决于的O / S心血来潮。 请注意,我小心使用回声来打印文件的每一行; 那些人说是原子的原子读取写入。
如果我使用Perl脚本,例如读和回送线后以一个延时与那么我很可能看到更确定的行为(通常)从读取器1的两行用于从阅读器2的每1行。
perl -n -e 'while(<>){ print "1: $_"; sleep 1; }' < fifo &
perl -n -e 'while(<>){ print "2: $_"; sleep 2; }' < fifo &
实验在Mac OS X 10.5.8(Leopard)的完成 - 但可能是最相似的地方。
我想补充以上的解释写入(和推测读取,虽然我无法证实这一点从手册页)来管是原子达到一定规模(4KiB在Linux上)。 因此,假设我们开始与空管,和作家<= 4KiB数据写入到管道。 这是我想发生:
一)笔者一次性写入的所有数据。 当发生这种情况没有其他进程有机会从读(或写)的管道。
b)一名读者的计划做它的I / O。
c)在选择阅读器读取一气呵成从管道中的所有数据,并在一段时间后把结果打印到标准输出。
我想,当你仅仅从一个读者看到输出这可以解释。 试着写较小的块,每个写入之后也许睡觉。
当然,其他人已经回答了为什么每个数据仅由进程读取。