UNIX常见问题解答(FAQ_04).docVIP

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
UNIX常见问题解答(FAQ_04)

UNIX常见问题解答(FAQ_04) UNIX常见问题解答(FAQ_04) 作者:none 本篇文章回答以下问题: 4.1) 要如何在使用者不必按 RETURN 的情况下从 terminal 读进东西? 4.2) 我要如何在未曾真的读进东西的情况下检查是否有字元等待读取? 4.3) 要怎样才能得知一个已open 档案之档名? 4.4) 一个执行中的程式如何知道自己的 pathname? 4.5) 如何用 popen() 对一个 process 做读写的动作? 4.6) 在 C 程式中要怎么用 sleep() 才能够 sleep 小于一秒? 4.7) 如何让 setuid 的 shell script 可以使用? 4.8) 我要如何得知有哪些 process 开了某一档案,或某一 process 正在使用哪 一个 filesystem(以至于我无法 unmount 这个 filesystem)? 4.9) 我要怎么知道是谁在 finger 我啊? 4.10) 能不能在一个 process 和 terminal 的连接已经断掉之后再接回来,例如 在 background 跑一个程式然后就 logout 而断掉的程式? 4.11) 有没有办法可以偷听一个 terminal,就是说将其输出复制一份至其他的 terminal。 4.1) 要如何在使用者不必按 RETURN 的情况下从 terminal 读进东西? 在 BSD 中用 cbreak 模式,在 SysV 中则用 ~ICANON 模式。 如果你懒得用 ioctl(2) 来设定 terminal 的参数,也可以用 stty 来做, 不过有点慢又没有效率就是了。底下的程式自己看著办吧: #include stdio.h main() { int c; printf(Hit any character to continue\n); /* * ioctl() would be better here; only lazy * programmers do it this way: */ system(/bin/stty cbreak); /* or stty raw */ c = getchar(); system(/bin/stty -cbreak); printf(Thank you for typing %c.\n, c); exit(0); } 有好几个人送给我更正确的解法。不过很抱歉我不想把它们加进去,因为这已经 超出这份文件的范围了。 通常对这个问题有兴趣的人,都是想要做一些控制萤幕显示之类的事情。如果你 也是的话,那请参考 curses 的相关文件。 curses 是一个 portable 的萤 幕控制函数库。 4.2) 我要如何在未曾真的读进东西的情况下检查是否有字元等待读取? 一些版本的 UNIX 提供了检查某个 file descriptor 目前是否有东西待读取的 方法。在 BSD 中,可以用 select(2),也可以用 FIONREAD ioctl,检查有几 个字元等待读取,不过这只对 terminal, pipe, 与 socket 有用。在 System V Release 3 中可以用 poll(2),不过只对 stream 有用。在 Xenix 与 Sys V r3.2 及其以后的版本里,有一个名叫 rdchk() 的 system call 可以用来检查 对一个 file descriptor 做 read() 会不会卡住。 没有方法可以用来判断是否有字元在 FILE pointer 中待读取。(你可以直接查 看 stdio 的资料结构,看看是否 input buffer 是空的,但是这方法有时会失 效,因为你没有办法知道当你下一次要填满这个 buffer 时会发生什么事。) 有时人们问这个问题是因为想写 if (characters available from fd) read(fd, buf, sizeof buf); 以达成 nonblocking read。这不是一种好的做法,因为可能测的时候有东西, 要读的时候,已经没有东西可读了。正确的做法应该是用 fcntl(2) 里的 F_SETFL 设定 O_NDELAY。比较旧的系统(Version 7, 4.1 BSD) 没有 O_NDELAY,那就得用 alarm(2) 来设定 read 的 timeout,以达成近似 nonblocking read 的功能。 4.3) 要怎样才能得知一个已 open 档案之档名? 这个是非常困难的。若是这个 file desc

您可能关注的文档

文档评论(0)

jgx3536 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档