|
|
目的是禁止某个后台程序运行时写终端,也就是将标准输出和标准出错全部扔掉,不让它显示
在书里面有介绍 获得和设置终端属性 的方法,用到下面两个函数:
- #include <termios.h>
- int tcgetattr (int filedes, struct termios *termptr) ;
- int tcsetattr (int filedes, int opt, const struct termios *termptr) ;
复制代码
书里有一个介绍他用法的例程,懒得敲进来了,大家看看 http://www.mamiyami.com/document/apue/11.pdf
里面那个程序11-2就是啦,不过这个程序是使用屏蔽标志取或设置一个值,跟我的问题没有太大关系,
书里面提到一个终端标志:c_lflag 的 TOSTOP,
可以用这个标志来禁止后台程序写终端。以下是书里的说明:
- • TOSTOP (c_lflag, POSIX.1)如若设置,并且该实现支持作业控制,则将信号SIGTTOU送到试图写控制终端的
- 一个后台进程的进程组。按默认,此信号暂停该进程组中所有进程。如果写控制终端的进程忽略或阻塞此信号,
- 则终端驱动程序不产生此信号。
复制代码
我的问题来了:是不是要另外写一个程序(假设它为 A),在 A 里 tcsetattr() 函数设置TOSTOP 标志 。然后运行它,此时A 进程就会产生 SIGTTOU 信号。但光产生这个信号是毫无意义的,必须有一个企图写终端的后台进程(假设为B)也同时运行,这时 B 接收到 SIGTTOU 信号,于是它就不能向终端写东西了。
又或者我可以把A 设置为父进程,原本的后台程序 B 作为 A 的子进程,这样只要写一个程序(假设为AB)就可以了。如果后台运行AB,则作为父进程的 A 产生 SIGTTOU 信号,他儿子 B 接收到以后就没法再写终端了。不过这样做可行性也许不大。按照书里面的说法“将信号SIGTTOU送到试图写控制终端的一个后台进程的进程组”这是否就决定了 A 不能为后台进程??而B 必须是后台的??
我还是先试验一下吧,欢迎大家多给些宝贵意见,或者更合理的方法!目的才是最重要的,能禁止后台程序在终端乱嚷嚷就行~ |
|