LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: 小百合

如何禁止后台程序写终端?????

[复制链接]
 楼主| 发表于 2006-5-24 23:24:40 | 显示全部楼层
Post by Arthur.Echo
  1. #include <unistd.h>
  2. #include <fcntl.h>
  3. #include <stdio.h>

  4. int main(void)
  5. {
  6.         int fd_null;
  7.         fd_null = open("/dev/null",O_WRONLY);

  8.         dup2(fd_null,1);
  9.         dup2(fd_null,2);

  10.         exec(your_command);
  11. }
复制代码


用这个程序就可以叫后台程序闭嘴了对吗??

有个疑问:程序运行后,是不是所有的标准输出都被禁止了?还是只有这个进程里面的输出被禁止??比如我在main()里面加上
“printf(“can  you see me?\n")”程序运行后就看不到这句话了。

如果是所有的标准输出都被禁止,那看来还得向想想别的办法。
先来试试哈~

谢谢Arthur.Echo!谢谢大家!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-25 08:47:47 | 显示全部楼层
Post by newroot
是不是这个意思,用终端设置函数调整的是整个终端的属性!

如果是自己写的程序的话,可以按照daemon进程的写法把终端i/o关闭!


可以说详细点吗??我这里有daemon进程的例子,但是里面没有关闭终端 io 呢。
如果您有的话,麻烦给我参考参考,嘿嘿,谢谢啦~~
回复 支持 反对

使用道具 举报

发表于 2006-5-25 14:00:34 | 显示全部楼层
我替二楼的兄弟解释一下

程序本身不用做任何特殊改动, 但是在调用此程序的时候, 通过重定向使得它不能向终端进行输出

为了给楼主一个直观的认识, 请在终端 (比如 xterm, terminal 或者 "纯文本界面") 下执行
ls > /dev/null 2>&1
回复 支持 反对

使用道具 举报

发表于 2006-5-25 17:22:57 | 显示全部楼层
Post by 小百合
用这个程序就可以叫后台程序闭嘴了对吗??

有个疑问:程序运行后,是不是所有的标准输出都被禁止了?还是只有这个进程里面的输出被禁止??比如我在main()里面加上
“printf(“can  you see me?\n")”程序运行后就看不到这句话了。

如果是所有的标准输出都被禁止,那看来还得向想想别的办法。
先来试试哈~

谢谢Arthur.Echo!谢谢大家!

这个只是禁止了这一个进程写标准输出和标准出错,其他的不会有什么影响
回复 支持 反对

使用道具 举报

发表于 2006-5-25 19:00:03 | 显示全部楼层

不知道这个是不是需要的

Post by Arthur.Echo
这个只是禁止了这一个进程写标准输出和标准出错,其他的不会有什么影响


Closing Standard File Descriptors
One of the last steps in setting up a daemon is closing out the standard file descriptors (STDIN, STDOUT, STDERR). Since a daemon cannot use the terminal, these file descriptors are redundant and a potential security hazard.

        /* Close out the standard file descriptors */
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
回复 支持 反对

使用道具 举报

发表于 2006-5-25 20:06:46 | 显示全部楼层
Post by eagles125
Closing Standard File Descriptors
One of the last steps in setting up a daemon is closing out the standard file descriptors (STDIN, STDOUT, STDERR). Since a daemon cannot use the terminal, these file descriptors are redundant and a potential security hazard.

        /* Close out the standard file descriptors */
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);

但是现在他的程序不是daemon,所以有可能在它的程序中确实会写标准输出和标准出错,如果只是简单的关闭这些描述符,我怀疑这个程序在写标准输出和标准出错的时候会不会出现问题,这一点我没有验证过。而如果将标准输出和标准出错重定向到/dev/null就不会有这个问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-26 09:05:51 | 显示全部楼层
试过了,只有这个进程里面的标准输出被禁止而已

原理是重定向标准输出,使打印到终端的语句都指向另外一个文件

           int fd;
         fd= open("/home/rubish",O_WRONLY);
           dup2(fd,STDOUT_FILENO);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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