c语言连接文本文件,C语言-开启daemon 守护进程,建立socket 连接,输出文本文件数据--Segmentation fault...

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

可以帮你做到.

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值