经过调试,发现问题和内核部分没有关系了,问题是:
全局变量sock_fd用于接收内核数据的套接字=0;
sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_TEST);
而应用层还有其他创建的套接字socklog也等于0,使得close(socklog)时等于将sock_fd关闭,无法接受内核数据;
socklog=socket(AF_INET, SOCK_STREAM, 0);
不知道如何解决,连续几次的socket调用,期间不释放,返回都为0!!
请高手看看!!谢谢!!
2008/10/24 Docoocoo <doco...@gmail.com>
sock_fd=0, 显然是创建PF_NETLINK, RAW sock 失败。应该在检测到这个失败后,打印error看看是什么错误。
不会是需要root权限吧?赫赫。
而且我的sock_fd能够正常工作,只是新创建的socklog=socket(AF_INET, SOCK_STREAM, 0);
也为0,使得关闭socklog的时候把sock_fd关掉了,而sock_fd是全局的,需要一直存活,接收内核模块过来的数据。
而且一个问题就是:
socklog=socket(AF_INET, SOCK_STREAM, 0);
socklog1=socket(AF_INET, SOCK_STREAM, 0);
连续两次创建socklog和socklog1为0,即使中间不close(socklog);
2008/10/28 Luke Zhang (luzhan) <luz...@cisco.com>
2008/10/29 Docoocoo <doco...@gmail.com>:
--
Best Regards
Xinyu
________________________________
NAME
daemon - run in the background
SYNOPSIS
#include <unistd.h>
int daemon(int nochdir, int noclose);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
daemon(): _BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500)
DESCRIPTION
The daemon() function is for programs wishing to detach themselves from
the controlling terminal and run in the background as system daemons.
Unless the argument nochdir is nonzero, daemon() changes the current
working directory to the root ("/").
Unless the argument noclose is nonzero, daemon() will redirect standard
input, standard output and standard error to /dev/null.
2008/10/29 Luke Zhang (luzhan) <luz...@cisco.com>:
--
Best Regards
Xinyu
2008/10/29 Xinyu Chen <mudd...@gmail.com>
Thanks Peter Teoh,for your continued attention!
Thanks Xinyu Chen,told me checking daemon code!
Thanks 栾利刚,Luke Zhang and linux-kernel ^^ ^^!
Best Regards!
//the code of create daemon
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int init_daemon ()
{
pid_t pid;
pid = fork ();
if (pid < 0)
{
perror ("fork");
return -1;
}
if (pid != 0)
exit (0);
pid = setsid();
if (pid < -1)
{
perror ("setsid");
return -1;
}
chdir ("/");
int fd;
fd = open ("/dev/null", O_RDWR, 0);
if (fd != -1)
{
dup2 (fd, STDIN_FILENO);
dup2 (fd, STDOUT_FILENO);
dup2 (fd, STDERR_FILENO);
if (fd > 2)
close (fd);
}
umask (0027);
return 0;
}
2008/11/18 Docoocoo <doco...@gmail.com>