UNIX环境高级编程_split_6.pdf
上传人:qw****27 上传时间:2024-09-12 格式:PDF 页数:52 大小:4.6MB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

UNIX环境高级编程_split_6.pdf

UNIX环境高级编程_split_6.pdf

预览

免费试读已结束,剩余 42 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第91章伪终端194下载让被ytp调用的进程能够处理作业控制信号的唯一的方法是:另外增加一个命令行标志让ptytp子进程能够自己认识作业暂停字符,而不是让该字符通过其他行规程模块。19.6.3检查长时间运行程序的输出另一个使用ytp进行作业控制交互的例子见图6-91。如果运行一个程序:ptyslowout>file.out&当子进程试图从标准输入(终端)读入数据时,ytp进程立刻停止运行。这是因为该作业是一个后台作业并且当它试图访问终端时会使作业控制停止。如果将标准输入重定向使得ytp不从终端读取数据,如:ptyslowout</dev/null>file.out&那么ytp程序立即终止,这是因为它从标准输入读取到一个文件结束符。解决这个问题的方法是使用i-选择项。这个选择项的含义是忽略来自标准输入的文件结束符:pty-islowout</dev/null>file.out&这个标志导致在遇到文件结束符时,程序5-91的子进程终止,但子进程不会使父进程也终止。相反的,父进程一直将伪终端从设备的输出拷贝到标准输出(本例中的tuo.elif)。19.6.4script程序使用ytp程序,可以用下面的方式实现DSB系统中的tpircs(1)程序。#!/bin/shs/nib/!#pty"${SHELL:-/bin/sh}"|teetypescript一旦执行这个tpircs程序,即可以运行sp来观察进程之间的关系。图8-91显示了这些关系。typescriptpircsepyt文件登录ytpytpshelllehs父进程子进程管道行描述行描述ptytpytpttytt主设备从设备用户图19-8scriptshell脚本在这个例子中,假设LLEHS变量是llehSnroK(可能是hsk/nid/)。如前面所述,tpircs仅仅是将新的llehs(和它调用的所有的子进程)的输出拷贝出来,但是因为伪终端从设备上的行规程模块通常允许回显,故绝大多数键入都被写到tpircsepyt文件中去。49294XINU环境高级编程下载19.6.5运行协同进程在程序9-41中,我们不能让协同进程使用标准O/I函数,其原因是标准输入和输出不是终端,其输入和输出将被放到缓存中。如果用if(execl("./pty","pty","-e","add2",(char*)0)<0)替代:if(execl("./add2","add2",(char*)0)<0)在ytp下运行协同进程,该程序即使使用了标准O/I仍然可以正确运行。图9-91显示了在使用伪终端作为协同进程的输入和输出的情况。框中的“驱动程序”是前面提到过的改变了lcexe的程序9-41。这是图5-91的一个扩充,它显示了所有的进程间联系和数据流。ptytpytp2dda驱动程序父进程子进程协同进程管道2管道1终端行规程终端行规程终端设备ptytp主设备ytp从设备驱动程序终端上的用户图19-9运行一协同进程,以ytp作为其输入和输出这个例子显示了对于ytp程序e-(不回显)选择项的重要性。ytp不以交互方式运行,这是因为它的标准输入不是一个终端。在程序4-91evitca中retni标志默认为eslaf,这是因为对yttasi调用的返回结果是eslaf。这意味着在真正的终端之上的行规程保持在典型模式下并允许回显。指定e-选择项后,关掉了伪终端从设备上的行规程模块的回显。如果不这样做,则键入的每一个字符都将被两个行规程模块显示两次。我们还要用e-选择项关闭soimret结构的RCLNO标志,防止所有的协同进程的输出被回车和换行符终止。在不同的系统上测试这个例子会遇到8.21节描述ndaern和etirw函数时提到的问题。当描述符不是引用普通的磁盘文件时,从daer返回的读取数据量可能因实现不同而有所区别。协同进程使用ytp时,如果调用通过管道的daer而返回结果不到一行,将输出不可预测的结果。解决的方法不是使用程序9-41而是使用修改过的使用标准O/I库的习题5.41的程序,将两个管道都设置为行缓存。这样stegf函数将会读完一个整行。程序9-41的elihw循环假设送到协同进程的每一行都会带来一行的返回结果。19.6.6用非交互模式驱动交互式程序虽然让ytp运行所有的协同进程是非常诱人的想法,但如果协同进程是交互式的,就不能第91章伪终端394下载正常工作。问题在于ytp只是将其标准输入复制到ytp,并将来自ytp的复制到其标准输出。而并不关心具体得到什么数据。举个例子,我们可以在yt