QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1161|回复: 0

如何禁止后台进程在终端下乱嚷嚷??

[复制链接]
发表于 2006-5-22 17:13:32 | 显示全部楼层 |阅读模式
目的是禁止某个后台程序运行时写终端,也就是将标准输出和标准出错全部扔掉,不让它显示

在书里面有介绍 获得和设置终端属性 的方法,用到下面两个函数:
[code:1]
#include <termios.h>

int   tcgetattr (int  filedes,  struct  termios   *termptr) ;
int   tcsetattr (int  filedes,   int  opt,  const  struct  termios  *termptr) ;
[/code:1]
书里有一个介绍他用法的例程,懒得敲进来了,大家看看 http://www.mamiyami.com/document/apue/11.pdf
里面那个程序11-2就是啦,不过这个程序是使用屏蔽标志取或设置一个值,跟我的问题没有太大关系,

书里面提到一个终端标志:c_lflag 的 TOSTOP,
可以用这个标志来禁止后台程序写终端。以下是书里的说明:
[code:1]
• TOSTOP (c_lflag, POSIX.1)如若设置,并且该实现支持作业控制,则将信号SIGTTOU送到试图写控制终端的一个后台进程的进程组。按默认,此信号暂停该进程组中所有进程。如果写控制终端的进程忽略或阻塞此信号,则终端驱动程序不产生此信号。
[/code:1]

我的问题来了:是不是要另外写一个程序(假设它为 A),在 A 里 tcsetattr() 函数设置TOSTOP 标志 。然后运行它,此时A 进程就会产生 SIGTTOU 信号。但光产生这个信号是毫无意义的,必须有一个企图写终端的后台进程(假设为B)也同时运行,这时 B 接收到 SIGTTOU 信号,于是它就不能向终端写东西了。

又或者我可以把A 设置为父进程,原本的后台程序 B 作为 A 的子进程,这样只要写一个程序(假设为AB)就可以了。如果后台运行AB,则作为父进程的 A 产生 SIGTTOU 信号,他儿子 B 接收到以后就没法再写终端了。不过这样做可行性也许不大。按照书里面的说法“将信号SIGTTOU送到试图写控制终端的一个后台进程的进程组”这是否就决定了 A 不能为后台进程??而B 必须是后台的??

我还是先试验一下吧,欢迎大家多给些宝贵意见,或者更合理的方法!目的才是最重要的,能叫后台进程闭嘴就行~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 16:24 , Processed in 0.053027 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表