⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000004.htm

📁 一份很好的linux入门资料
💻 HTM
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;wshu&nbsp;(树上的老虎),&nbsp;信区:&nbsp;Unix&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;UNIX&nbsp;FAQ&nbsp;中文版(四)&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Mon&nbsp;May&nbsp;19&nbsp;10:12:11&nbsp;1997)&nbsp;<BR>&nbsp;<BR>本篇文章回答以下问题:&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.1)&nbsp;&nbsp;要如何在使用者不必按&nbsp;RETURN&nbsp;的情况下从&nbsp;terminal&nbsp;读进东西?&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.2)&nbsp;&nbsp;我要如何在未曾真的读进东西的情况下检查是否有字元等待读取?&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.3)&nbsp;&nbsp;要怎样才能得知一个已open&nbsp;档案之档名?&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.4)&nbsp;&nbsp;一个执行中的程式如何知道自己的&nbsp;pathname?&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.5)&nbsp;&nbsp;如何用&nbsp;popen()&nbsp;对一个&nbsp;process&nbsp;做读写的动作?&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.6)&nbsp;&nbsp;在&nbsp;C&nbsp;程式中要怎么用&nbsp;sleep()&nbsp;才能够&nbsp;sleep&nbsp;小于一秒?&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.7)&nbsp;&nbsp;如何让&nbsp;setuid&nbsp;的&nbsp;shell&nbsp;script&nbsp;可以使用?&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.8)&nbsp;&nbsp;我要如何得知有哪些&nbsp;process&nbsp;开了某一档案,或某一&nbsp;process&nbsp;正在使用哪&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个&nbsp;fileystem(以至于我无法&nbsp;unmount&nbsp;这个&nbsp;filesystem)?&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.9)&nbsp;&nbsp;我要怎么知道是谁在&nbsp;finger&nbsp;我啊?&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.10)&nbsp;能不能在一个&nbsp;process&nbsp;和&nbsp;terminal&nbsp;的连接已经断掉之后再接回来,例如&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在&nbsp;background&nbsp;跑一个程式然后就&nbsp;logout&nbsp;而断掉的程式?&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.11)&nbsp;有没有办法可以偷听一个&nbsp;terminal,就是说将其输出复制一份至其他的&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;terminal。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;4.1)&nbsp;&nbsp;要如何在使用者不必按&nbsp;RETURN&nbsp;的情况下从&nbsp;terminal&nbsp;读进东西?&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在&nbsp;BSD&nbsp;中用&nbsp;cbreak&nbsp;模式,在&nbsp;SysV&nbsp;中则用&nbsp;~ICANON&nbsp;模式。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果你懒得用&nbsp;&quot;ioctl(2)&quot;&nbsp;来设定&nbsp;terminal&nbsp;的参数,也可以用&nbsp;stty&nbsp;来做,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不过有点慢又没有效率就是了。底下的程式自己看著办吧:&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&lt;stdio.h&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main()&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;c;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Hit&nbsp;any&nbsp;character&nbsp;to&nbsp;continue\n&quot;);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;ioctl()&nbsp;would&nbsp;be&nbsp;better&nbsp;here;&nbsp;only&nbsp;lazy&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;programmers&nbsp;do&nbsp;it&nbsp;this&nbsp;way:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;system(&quot;/bin/stty&nbsp;cbreak&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;or&nbsp;&quot;stty&nbsp;raw&quot;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;getchar();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;system(&quot;/bin/stty&nbsp;-cbreak&quot;);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Thank&nbsp;you&nbsp;for&nbsp;typing&nbsp;%c.\n&quot;,&nbsp;c);&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有好几个人送给我更正确的解法。不过很抱歉我不想把它们加进去,因为这已经&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;超出这份文件的范围了。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通常对这个问题有兴趣的人,都是想要做一些控制萤幕显示之类的事情。如果你&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;也是的话,那请参考&nbsp;&quot;curses&quot;&nbsp;的相关文件。&nbsp;&quot;curses&quot;&nbsp;是一个&nbsp;portable&nbsp;的萤&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;幕控制函数库。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;4.2)&nbsp;&nbsp;我要如何在未曾真的读进东西的情况下检查是否有字元等待读取?&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一些版本的&nbsp;UNIX&nbsp;提供了检查某个&nbsp;file&nbsp;descriptor&nbsp;目前是否有东西待读取的&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;方法。在&nbsp;BSD&nbsp;中,可以用&nbsp;&quot;select(2),也可以用&nbsp;FIONREAD&nbsp;ioctl,检查有几&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;个字元等待读取,不过这只对&nbsp;terminal,&nbsp;pipe,&nbsp;与&nbsp;socket&nbsp;有用。在&nbsp;System&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V&nbsp;Release&nbsp;3&nbsp;中可以用&nbsp;poll(2),不过只对&nbsp;stream&nbsp;有用。在&nbsp;Xenix&nbsp;与&nbsp;Sys&nbsp;V&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r3.2&nbsp;及其以后的版本里,有一个名叫&nbsp;rdchk()&nbsp;的&nbsp;system&nbsp;call&nbsp;可以用来检查&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对一个&nbsp;file&nbsp;descriptor&nbsp;做&nbsp;read()&nbsp;会不会卡住。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;没有方法可以用来判断是否有字元在&nbsp;FILE&nbsp;pointer&nbsp;中待读取。(你可以直接查&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;看&nbsp;stdio&nbsp;的资料结构,看看是否&nbsp;input&nbsp;buffer&nbsp;是空的,但是这方法有时会失&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;效,因为你没有办法知道当你下一次要填满这个&nbsp;buffer&nbsp;时会发生什么事。)&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有时人们问这个问题是因为想写&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(characters&nbsp;available&nbsp;from&nbsp;fd)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read(fd,&nbsp;buf,&nbsp;sizeof&nbsp;buf);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以达成&nbsp;nonblocking&nbsp;read。这不是一种好的做法,因为可能测的时候有东西,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要读的时候,已经没有东西可读了。正确的做法应该是用&nbsp;fcntl(2)&nbsp;里的&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F_SETFL&nbsp;设定&nbsp;O_NDELAY。比较旧的系统(Version&nbsp;7,&nbsp;4.1&nbsp;BSD)&nbsp;没有&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;O_NDELAY,那就得用&nbsp;alarm(2)&nbsp;来设定&nbsp;read&nbsp;的&nbsp;timeout,以达成近似&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nonblocking&nbsp;read&nbsp;的功能。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;4.3)&nbsp;&nbsp;要怎样才能得知一个已&nbsp;open&nbsp;档案之档名?&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个是非常困难的。若是这个&nbsp;file&nbsp;descriptor&nbsp;是对应到&nbsp;pipe&nbsp;或&nbsp;pty&nbsp;就没&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有名字了。这个&nbsp;file&nbsp;descriptor&nbsp;对应的档案也有可能已被删除。若是有&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;symbolic&nbsp;link&nbsp;或&nbsp;hard&nbsp;link,则可能有许多个名字。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果你经过一再考虑后别无选择一定要这么做的话,可以用&nbsp;find&nbsp;的&nbsp;-inum&nbsp;与&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-xdev&nbsp;选项,或用&nbsp;ncheck,或用自己写类似的程式来做。在这么做时要耐心的&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;等,因为在一个几百&nbsp;megabyte&nbsp;甚至几&nbsp;gigabyte&nbsp;的&nbsp;file&nbsp;system中找一个档&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;案,一定得花不少时间。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;4.4)&nbsp;&nbsp;一个执行中的程式如何知道自己的&nbsp;pathname?&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;若果&nbsp;argv[0]&nbsp;是以&nbsp;&quot;/&quot;&nbsp;开始的字,它可能就是你的程式所在地的绝对路径。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果不是那就得照顺序检查&nbsp;PATH&nbsp;里的每一个目录看看里面是否有与&nbsp;argv[0]&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一样的程式。如果找得到的话将那个目录与程式名称兜起来可能就是你要的&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pathname&nbsp;了。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不过上述方法找到的并不一定是正确的,因为在程式中用到&nbsp;exec()&nbsp;时,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argv[0]&nbsp;是可以随便给的。将&nbsp;argv[0]&nbsp;设为与要执行的程式名称相同只是一&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;种惯用法罢了!&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以下的例子可能会使你更清楚些:&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&lt;stdio.h&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main()&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;execl(&quot;/usr/games/rogue&quot;,&nbsp;&quot;vi&nbsp;Thesis&quot;,&nbsp;(char&nbsp;*)NULL);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个被执行的程式就会认为它的名字(argv[0]&nbsp;之值)是&nbsp;&quot;vi&nbsp;Thesis&quot;)。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;4.5)&nbsp;&nbsp;如何用&nbsp;popen()&nbsp;对一个&nbsp;process&nbsp;做读写的动作?&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用&nbsp;pipe&nbsp;将一个&nbsp;process&nbsp;的输出、输入转给任意的&nbsp;process&nbsp;所可能会发生的&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;问题就是&nbsp;deadlock,譬如这两个&nbsp;processes&nbsp;刚好同时都在等待「尚未产生」&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的输入时。唯一能避免&nbsp;deadlock&nbsp;的方法就是在&nbsp;pipe&nbsp;的两端都要遵循严格的&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deadlock-free&nbsp;协定,但是需要这些&nbsp;processes&nbsp;之间的互相合作才能达成,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;而对于像&nbsp;popen()&nbsp;这类的函数来说并不太适合。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在&nbsp;'expect'&nbsp;这个软体中附有一个能够让&nbsp;C&nbsp;程式直接引用的函式库。其中有&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个函式不管是在读或写都能达到和&nbsp;popen&nbsp;相同的功能。但是这个函式使&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -