- 论坛徽章:
- 0
|
回复 4# MMMIX
问题定位到了,也知道原因了,这个fd的值被篡改是因为syslog。步骤如下:
1》首先我的这个程序是守护进程,他在变为守护进程前,有调用openlog以及syslog来打印日志。但没有调用closelog。
2》变为守护进程后,他调用如下代码,关掉所有的文件句柄:
- max_fd = sysconf (_SC_OPEN_MAX);
- for (i = 0; i < max_fd; i++)
- close (i);
复制代码 同时将fd为0,1,2的重新分配
- if ((i = open("/dev/null", O_RDWR)) >= 0) {
- while (0 <= i && i <= 2)
- i = dup(i);
- if (i >= 0)
- close(i);
- }
复制代码 3》打开一个watchdog的文件,此时,fd的值变为3,并指向watchdog
4》再次调用openlog,进行日志打印,此时fd为3的值的指向被篡改。指向syslog的socket
解决办法:
在第一步中,在这个进程变为守护进程前,先调用closelog将syslog打开的文件描述符关掉,后面就不会有这个问题了。
疑问:
问什么调用系统的close并不能关掉syslog,而必须要使用closelog才可以?
而且就算关闭不成功,这个fd的值也不应该重新被分配啊?
不知大神可否解答一二,谢谢。
|
|