📄 00000005.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: <A HREF="mailto:freedom@csie.nctu.edu.tw">freedom@csie.nctu.edu.tw</A> (Tan Koan-Sin), 信区: unix <BR>标 题: UNIX FAQ 中文版 Part 4 <BR>发信站: Computer Sci. & Information Eng., NCTU, (Tue Jul 11 03:10:50 1995) <BR>转信站: phoenix!news.csie.nctu!freedom <BR>Origin: <A HREF="mailto:freedom@dragon.csie.nctu.edu.tw">freedom@dragon.csie.nctu.edu.tw</A> <BR> <BR> <BR>这七篇文章包含一些在 comp.unix.questions 和 comp.unix.shell 常见到的问 <BR>题。请不再问这些问题,因为这些问题已经被回答过太多次了。但也请不要因为 <BR>有人问这些问题而发火,因为他们可能尚未读过这些文章。 <BR> <BR>This collection of documents is Copyright (c) 1994, Ted Timar, except <BR>Part 6, which is Copyright (c) 1994, Pierre Lewis and Ted Timar. <BR> <BR>All rights reserved. Permission to distribute the collection is <BR>hereby granted providing that distribution is electronic, no money is <BR>involved, reasonable attempts are made to use the latest version and <BR>all credits and this copyright notice are maintained. <BR> <BR>Other requests for distribution will be considered. <BR> <BR>All reasonable requests will be granted. <BR> <BR>中文翻译 by {chenjl,freedom,jjyang}<A HREF="mailto:@csie.nctu.edu.tw">@csie.nctu.edu.tw</A> <BR>若您对中文翻译有任何意见请发 e-mail 给 <A HREF="mailto:cfaq@csie.nctu.edu.tw">cfaq@csie.nctu.edu.tw</A> <BR> <BR>我们希望这些文件中的资讯能对你有所帮助,但是并不保证是正确的。若发生损 <BR>害请自行负责 <BR> <BR>您可以在 rtfm.mit.edu 的 pub/usenet/news.answers 找到包括此文件在内的 <BR>许多 FAQ。 在此目录下的 FAQ 的名字可在文章的顶端的 "Archive-Name:" <BR>一行找到。 <BR> <BR>[译注: 在台湾请用 NCTUCCA.edu.tw:/USENET/FAQ,在交大的话 <BR> ftp.csie.nctu.edu.tw:/pub/FAQ 是从 CCCA mirror 来的] <BR> <BR> 此一 FAQ 是以"unix-faq/faq/part[1-7]" 为名。 <BR> <BR>这些文章大约分成: <BR> <BR> 1.*)一般性的问题 <BR> 2.*)初学者可能会问的基本问题 <BR> 3.*) 中级的问题 <BR> 4.*) 自以为已经知道所有答案的人可能会问的高级问题 <BR> 5.*) 关於各种 shell 的问题 <BR> 6.*) 各式各样的 Unix <BR> 7.*) An comparison of configuration management systems (RCS, SCCS). <BR> <BR>This article includes answers to: <BR> <BR> 4.1) 要如何在使用者不必按 RETURN 的情况下从 terminal 读进东西? <BR> 4.2) 我要如何在未曾真的读进东西的情况下检查是否有字元等待读取? <BR> 4.3) 要怎样才能得知一个已open 档案之档名? <BR> 4.4) 一个执行中的程式如何知道自己的 pathname? <BR> 4.5) 如何用 popen() 对一个 process 做读写的动作? <BR> 4.6) 在 C 程式中要怎麽用 sleep() 才能够 sleep 小於一秒? <BR> 4.7) 如何让 setuid 的 shell script 可以使用? <BR> 4.8) 我要如何得知有哪些 process 开了某一档案,或某一 process 正在使用哪 <BR> 一个 fileystem(以至於我无法 unmount 这个 filesystem)? <BR> 4.9) 我要怎麽知道是谁在 finger 我啊? <BR> 4.10) 能不能在一个 process 和 terminal 的连接已经断掉之後再接回来,例如 <BR> 在 background 跑一个程式然後就 logout 而断掉的程式? <BR> 4.11) 有没有办法可以偷听一个 terminal,就是说将其输出复制一份至其他的 <BR> terminal。 <BR> <BR>若要找问题 4.5 的答案, 用 regular expression 往前找 "^4.5)" 即可。 <BR> <BR>因为这些都是正当合理的问题, 所以在 comp.unix.questions 或是 <BR>comp.unix.shell 中。每隔一阵子, 就会有这些问题与答案出现, 紧接著就会 <BR>有人对同样问题一再出现发牢骚。关於 UNIX 代表啥呢? 请参考每月 post 在 <BR>news.announce.newusers 中名为 "Answers to Frequently Asked Questions" <BR>的文章。 <BR> <BR>因为 Unix 有太多不同的种类了, 所以很难保证此文件所提供的答案必然会有 <BR>用。在尝试本文件提供的作法前, 请先读读你所使用系统的手册。若你对答案 <BR>有任何建议或更正, 请送 email 给 <A HREF="mailto:tmtaimar@isgtec.com.">tmtaimar@isgtec.com.</A> <BR> <BR>---------------------------------------------------------------------- <BR> <BR>Subject: How do I read characters ... without requiring the user to hit RETURN? <BR>Date: Thu Mar 18 17:16:55 EST 1993 <BR> <BR>4.1) 要如何在使用者不必按 RETURN 的情况下从 terminal 读进东西? <BR> <BR> 在 BSD 中用 cbreak 模式,在 SysV 中则用 ~ICANON 模式。 <BR> <BR> 如果你懒得用 "ioctl(2)" 来设定 terminal 的参数,也可以用 stty 来做, <BR> 不过有点慢又没有效率就是了。底下的程式自己看著办吧: <BR> <BR> #include <stdio.h> <BR> main() <BR> { <BR> int c; <BR> <BR> printf("Hit any character to continue\n"); <BR> /* <BR> * ioctl() would be better here; only lazy <BR> * programmers do it this way: <BR> */ <BR> system("/bin/stty cbreak"); /* or "stty raw" */ <BR> c = getchar(); <BR> system("/bin/stty -cbreak"); <BR> printf("Thank you for typing %c.\n", c); <BR> <BR> exit(0); <BR> } <BR> <BR> 有好几个人送给我更正确的解法。不过很抱歉我不想把它们加进去,因为这已经 <BR> 超出这份文件的□围了。 <BR> <BR> 通常对这个问题有兴趣的人,都是想要做一些控制萤幕显示之类的事情。如果你 <BR> 也是的话,那请参考 "curses" 的相关文件。 "curses" 是一个 portable 的萤 <BR> 幕控制函数库。 <BR> <BR>------------------------------ <BR> <BR>Subject: How do I check to see if there are characters to be read ... ? <BR>Date: Thu Mar 18 17:16:55 EST 1993 <BR> <BR>4.2) 我要如何在未曾真的读进东西的情况下检查是否有字元等待读取? <BR> <BR> 某些版本的 UNIX 提供了检查某个 file descriptor 目前是否有东西待读取的 <BR> 方法。在 BSD 中,可以用 "select(2),也可以用 FIONREAD ioctl,检查有几 <BR> 个字元等待读取,不过这只对 terminal, pipe, 与 socket 有用。在 System <BR> V Release 3 中可以用 poll(2),不过只对 stream 有用。在 Xenix 与 Sys V <BR> r3.2 及其以後的版本里,有一个名叫 rdchk() 的 system call 可以用来检查 <BR> 对一个 file descriptor 做 read() 会不会卡住。 <BR> <BR> 没有方法可以用来判断是否有字元在 FILE pointer 中待读取。(你可以直接查 <BR> 看 stdio 的资料结构,看看是否 input buffer 是空的,但是这方法有时会失 <BR> 效,因为你没有办法知道当你下一次要填满这个 buffer 时会发生什麽事。) <BR> <BR> 有时人们问这个问题是因为想写 <BR> if (characters available from fd) <BR> read(fd, buf, sizeof buf); <BR> 以达成 nonblocking read。这不是一种好的做法,因为可能测的时候有东西, <BR> 要读的时候,已经没有东西可读了。正确的做法应该是用 fcntl(2) 里的 <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -