C语言-开启daemon 守护进程,建立socket 连接,输出文本文件数据--Segmentation fault
(2012-04-09 22:55:12)
标签:
数据
文本文件
c语言
守护
杂谈
C语言-开启daemon 守护进程,建立socket 连接,输出文本文件数据--Segmentation
fault我的代码是server端 开启daemon 守护进程,建立socket 连接,输出文本文件数据
分三段代码执行..但结束却只输出读取文件文件的数据...
daemon进程也没有开启..连接的话由于client没有写....
大家帮我看下这段代码.
SP:通过daemon程序从/proc/net/dev读取并统计流量,通过socket连接在10.0.0.4上读取daemon提供的流量信息并显示,通过gd库绘制图形。
#include
//fork,exit,setsid,chdir,closeneeded
#include
//signalneeded
#include
//umask,socket,bind,connect,shmatneeded
#include
//bzero,strstrneeded
#include
//htonsneeded
#include
//inet_addr,socket,bind,listen,connectneeded
#include
//inet_addrneeded
#include
#include //shmget,shmctl
needed
#include
//shmget,shmat,shmctl needed
#include //zlog
needed
void daemon_init(const char * pdic)
{
//局部变量
int i;
pid_t pid;
//开启第一子进程
if (pid=fork())
exit(0); //终止父进程
//以下为第一子进程的工作
setsid();
//创建一个进程组
signal(SIGHUP,SIG_IGN);
//忽略SIGHUP信号
//开启第二子进程
if(pid=fork())
exit(0);//终止第二子进程
//以下为第二子进程的工作
chdir(pdic);
//设定工作目录
umask(0);
//清除文件掩码
}//end daemon_init
// SOCKET连接
int init_sock_port(const char * pipaddr,unsigned int port)
{
int sockfd,new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size,portnumber;
char hello[]={"Hellohttp://www.wzwm.net/! Are You
Fine?\n"};
//if(argc!=2)
//{
//printf("Usage:%s
portnumber\a\n",argv);
//exit(1);
//}
//if((portnumber=atoi(argv))<0)
//{
//printf("Usage:%s
portnumber\a\n",argv);
//exit(1);
//}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
printf("Socket
error:%s\n\a",strerror(errno));
exit(1);
}
bzero(&server_addr,sizeof(struct
sockaddr_in));
server_addr.sin_family=AF_INET;
//server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr.s_addr=inet_addr("clinet-IP");
if(bind(sockfd,(struct sockaddr
*)(&server_addr),sizeof(struct sockaddr))==
-1)
{
printf("Bind
error:%s\n\a",strerror(errno));
exit(1);
}
if(listen(sockfd,5)==-1)
{
printf("Listen
error:%s\n\a",strerror(errno));
exit(1);
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr
*)(&client_addr),&sin_size
))==-1)
{
printf("Accept
error:%s\n\a",strerror(errno));
exit(1);
}
printf("Server get connection from
%s\n",inet_ntoa(client_addr.sin_addr));
if(write(new_fd,hello,strlen(hello))==-1)
{
printf("Write
Error:%s\n",strerror(errno));
exit(1);
}
close(new_fd);
}
close(sockfd);
exit(0);
}
//读取文件数据
void main()
{
char
s[255];
int
i;
int
bytesNumber;
FILE
*fp;
fp=fopen("/proc/net/dev",
"r");
fgets(s,
255, fp);
printf("%s\n",
s);
fgets(s,
255, fp);
printf("%s\n",
s);
fgets(s,
255, fp);
printf("%s\n",
s);
printf("now
read bytes:", s);
fscanf(fp,
"%s", s);
fscanf(fp,
"%d",
&bytesNumber);
printf("bytes
is %d", bytesNumber);
for(
i=1; i<=9; i++) {
fscanf(fp,
"%d",
&bytesNumber);
}
printf("\tAnother
bytes is %d\n", bytesNumber);
fgets(s,
255, fp);
printf("Read
complete.\n");
fclose(fp);
}
我都晕了...
问题已经在慢慢的处理...大家看第二页,我贴出了二段代码...
还有错误的相关信息!!!
[ 本帖最后由 守住每一天 于 2007-11-26 17:53 编辑
]程序不完整吧,而且守护进程创建也有问题,umask应该放在最前面。太乱了以上的程序是挺晕晕的.
我做了修改.但还是不行.我感觉没写对..但找不到原因.
#include
#include
#include
#include
#include
#include
#include
#include
void read(char*buff)
{
char s[255];
int i;
int bytesNumber,bytesNumber1;
FILE *fp;
fp=fopen("/proc/net/dev",
"r");
fgets(s, 255, fp);
printf("%s\n", s);
fgets(s, 255, fp);
printf("%s\n", s);
fgets(s, 255, fp);
printf("%s\n", s);
printf("now read bytes:",
s);
fscanf(fp, "%s", s);
fscanf(fp, "%d",
&bytesNumber1);
printf("bytes is %d",
bytesNumber);
for( i=1; i<=9; i++) {
fscanf(fp, "%d",
&bytesNumber);
}
printf("\tAnother bytes is %d\n",
bytesNumber);
sprintf(buff, "%d
%d",bytesNumber1, bytesNumber);
fgets(s, 255, fp);
printf("Read complete.\n");
fclose(fp);
}
int main(int argc, char *argv[])
{
int sockfd,new_fd;
int daemon_init(void);
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size,portnumber;
///以下为修改,注意下午的printf都不会有输出
char hello[1024];
daemon_init();
///修改完毕
if(argc!=2)
{
printf("Usage:%s
portnumber\a\n",argv[0]);
exit(1);
}
if((portnumber=atoi(argv[1]))<0)
{
printf("Usage:%s
portnumber\a\n",argv[0]);
exit(1);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
printf("Socket
error:%s\n\a",strerror(errno));
exit(1);
}
bzero(&server_addr,sizeof(struct
sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(portnumber);
if(bind(sockfd,(struct sockaddr
*)(&server_addr),sizeof(struct sockaddr))==
-1)
{
printf("Bind
error:%s\n\a",strerror(errno));
exit(1);
}
if(listen(sockfd,5)==-1)
{
printf("Listen
error:%s\n\a",strerror(errno));
exit(1);
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr
*)(&client_addr),&sin_size
))==-1)
{
printf("Accept
error:%s\n\a",strerror(errno));
exit(1);
}
printf("Server get connection from
%s\n",inet_ntoa(client_addr.sin_addr));
///以下为修改//
read(hello);
///修改结束/
if(write(new_fd,hello,strlen(hello))==-1)
{
printf("Write
Error:%s\n",strerror(errno));
exit(1);
}
close(new_fd);
}
close(sockfd);
exit(0);
}
编译时报错:
/tmp/ccy7Reyp.o(.text+0x1e9): In function `main':
: undefined reference to `daemon_init'
collect2: ld returned 1 exit status:mrgreen:
用daemon(); 这个函数吧~原帖由 sunorr 于 2007-11-26 11:20 发表
http://bbs.chinaunix.net/images/common/back.gif
:mrgreen:
用daemon(); 这个函数吧~
int main(int argc, char *argv[])
{
int sockfd,new_fd;
int daemon_init(void);
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size,portnumber;
char hello[1024];
daemon_init();
非常感谢您的回复!!!!! 感动ING~~~~
这里不是写了吗??
你能说明白些吗??/man 3 daemondaemon_init 找不着呀。非常感谢您的回复.
我对它进一步进行了修改.但还是报错.
server.c:38: conflicting types for `read'
/usr/include/unistd.h:310: previous declaration of `read'
int daemon_init(void)
{ pid_t pid;
if((pid = fork()) < 0) return(-1);
else if(pid != 0) exit(0);
setsid();
chdir("/tmp");
umask(0);
close(0);
close(1);
close(2);
return(0); }
void read(char*buff)
{
char s[255];
int i;
int bytesNumber,bytesNumber1;
FILE *fp;
fp=fopen("/proc/net/dev"http://www.kpeer.com/,
"r");
fgets(s, 255, fp);
printf("%s\n", s);
fgets(s, 255, fp);
printf("%s\n", s);
fgets(s, 255, fp);
printf("%s\n", s);
printf("now read bytes:",
s);
fscanf(fp, "%s", s);
fscanf(fp, "%d",
&bytesNumber1);
printf("bytes is %d",
bytesNumber);
for( i=1; i<=9; i++) {
fscanf(fp, "%d",
&bytesNumber);
}
printf("\tAnother bytes is %d\n",
bytesNumber);
sprintf(buff, "%d
%d",bytesNumber1, bytesNumber);
fgets(s, 255, fp);
printf("Read complete.\n");
fclose(fp);
}
int main(int argc, char *argv[])
{
int sockfd,new_fd;
int daemon_init(void);
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size,portnumber;
///以下为修改,注意下午的printf都不会有输出
char hello[1024];
daemon_init();
///修改完毕
if(argc!=2)
{
printf("Usage:%s
portnumber\a\n",argv[0]);
exit(1);
}
if((portnumber=atoi(argv[1]))<0)
{
printf("Usage:%s
portnumber\a\n",argv[0]);
exit(1);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
printf("Socket
error:%s\n\a",strerror(errno));
exit(1);
}
bzero(&server_addr,sizeof(struct
sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(portnumber);
if(bind(sockfd,(struct sockaddr
*)(&server_addr),sizeof(struct sockaddr))==
-1)
{
printf("Bind
error:%s\n\a",strerror(errno));
exit(1);
}
{
printf("Listen
error:%s\n\a",strerror(errno));
exit(1);
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr
*)(&client_addr),&sin_size
))==-1)
{
printf("Accept
error:%s\n\a",strerror(errno));
exit(1);
}
printf("Server get connection from
%s\n",inet_ntoa(client_addr.sin_addr));
///以下为修改//
read(hello);
///修改结束/
//没有使用syslogd ?//
if(write(new_fd,hello,strlen(hello))==-1)
{
printf("Write
Error:%s\n",strerror(errno));
exit(1);
}
close(new_fd);
}
close(sockfd);
exit(0);
}还有一个.daemon没有使用syslog 和sleep 可以吗?原帖由 守住每一天 于 2007-11-26 15:09 发表
http://bbs.chinaunix.net/images/common/back.gif
非常感谢您的回复.
我对它进一步进行了修改.但还是报错.
server.c:38: conflicting types for `read'
/usr/include/unistd.h:310: previous declaration of `read'
int daemon_init(void)
{ pid_t pid;
i ...
read 换个名字吧,
最好不要跟系统函数重名呀,
免得报一些错误信息.
而且你不是想要一个守护进程吗?
daemon
可以帮你做到.
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。