Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Debian上的Daemonize()问题_C_Linux_Sockets_Posix_Daemon - Fatal编程技术网

C Debian上的Daemonize()问题

C Debian上的Daemonize()问题,c,linux,sockets,posix,daemon,C,Linux,Sockets,Posix,Daemon,我目前正在为我的某个项目编写一个多进程客户端和一个多进程服务器 服务器是一个守护进程。 为了实现这一点,我使用以下daemonize()代码: 静态void守护进程(void) { pid_t pid,sid; /*已经是一个守护进程了*/ if(getppid()==1)返回; /*离开父进程*/ pid=fork(); if(pid0){ 退出(退出成功); } /*此时,我们将作为子进程执行*/ /*更改文件模式掩码*/ 乌马斯克(0); /*为子进程创建新SID*/ sid=setsid

我目前正在为我的某个项目编写一个多进程客户端和一个多进程服务器

服务器是一个守护进程。 为了实现这一点,我使用以下daemonize()代码:

静态void守护进程(void)
{
pid_t pid,sid;
/*已经是一个守护进程了*/
if(getppid()==1)返回;
/*离开父进程*/
pid=fork();
if(pid<0){
退出(退出失败);
}
/*如果我们得到一个好的PID,那么我们可以退出父进程*/
如果(pid>0){
退出(退出成功);
}
/*此时,我们将作为子进程执行*/
/*更改文件模式掩码*/
乌马斯克(0);
/*为子进程创建新SID*/
sid=setsid();
如果(sid<0){
退出(退出失败);
}
/*更改当前工作目录。这将阻止当前
目录被锁定;因此无法将其删除*/
如果((chdir(“/”)小于0){
退出(退出失败);
}
/*将标准文件重定向到/dev/null*/
freopen(“/dev/null”,“r”,stdin);
freopen(“/dev/null”,“w”,标准输出);
freopen(“/dev/null”,“w”,stderr);
}
int main(int argc,char*argv[]){
daemonize();
/*现在我们是一个守护进程——做我们得到报酬的工作*/
返回0;
}
在Debian(Ubuntu)上测试服务器时,我有一个奇怪的副作用

accept()函数始终无法接受连接,返回的pid为-1

我不知道是什么原因导致了这种情况,因为在RedHat&CentOS,它运行良好

当我删除对daemonize()的调用时,Debian上的一切都很好,当我将其添加回Debian时,同样的accept()错误再次出现

我一直在监视/proc//fd,一切看起来都很好

daemonize()和Debian版本中的某些东西似乎不起作用。 (Debian GNU/Linux 5.0、Linux 2.6.26-2-286#1 SMP)

知道是什么引起的吗


感谢您

当家长退出时:

/* If we got a good PID, then we can exit the parent process. */
if (pid > 0) {
    exit(EXIT_SUCCESS);
}
您应该调用
\u exit()
,而不是
exit()
。(我不确定这是否导致您的问题,但这是可能的)


accept()
返回-1时,
errno
设置为什么?(您可以在那里的代码中添加一个
perror(“accept”);

我可以指导您使用现有的库函数来完成相同的操作吗?

accept(2)手册页显示:

EINVAL套接字未侦听 连接,或addrlen无效 (例如,为负)

很可能你有

struct sockaddr_in;
socklen_t len;
...

new_fd = new_fd = accept(sockfd,(struct sockaddr *)&addr,&len);
但是,您需要将
len
设置为传入地址的大小:

struct sockaddr_in addr;
socklen_t len;
len = sizeof(addr);
...
new_fd = new_fd = accept(sockfd,(struct sockaddr *)&addr,&len);

因此,幸运的是,您未初始化的“len”变量在某些情况下会获得一些无意义的值,并且accept失败,而它恰好在其他情况下工作。

更改为添加了peror(“accept”)的_exit(),我得到-->accept:Invalid arguments我还调试了accept函数:new_fd=accept(sockfd,(struct sockaddr*)&地址和长度);new_fd返回-1,sockfd在应用程序上始终为4run strace-f,包括从启动到第一次accept()失败的所有内容,希望这会包含一些线索。打印/记录
errno
的值可能会有助于更好地确定
accept(2)
返回-1的原因。这正是发生的情况,非常感谢你。我在accept之前调试了len,包括daemonize调用和不包括daemonize调用。没有它是正的,有它是负的,不知道为什么会发生,但是将len设置为地址的大小解决了它!
struct sockaddr_in addr;
socklen_t len;
len = sizeof(addr);
...
new_fd = new_fd = accept(sockfd,(struct sockaddr *)&addr,&len);