首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言 开启daemon 守护进程,建立socket 连接,输出文本文件数据解决方案

2012-02-17 
C语言 开启daemon 守护进程,建立socket 连接,输出文本文件数据我的代码是server端 开启daemon 守护进程,建

C语言 开启daemon 守护进程,建立socket 连接,输出文本文件数据
我的代码是server端 开启daemon 守护进程,建立socket 连接,输出文本文件数据
分三段代码执行..但结束却只输出读取文件文件的数据...
daemon进程也没有开启..连接的话由于client没有写....
大家帮我看下这段代码.

C/C++ code
#include <unistd.h>                    //fork,exit,setsid,chdir,close  needed#include <signal.h>                    //signal  needed#include <sys/types.h>                //umask,socket,bind,connect,shmat  needed#include <string.h>                    //bzero,strstr  needed#include <netinet/in.h>                //htons  needed#include <sys/socket.h>                //inet_addr,socket,bind,listen,connect  needed#include <arpa/inet.h>                //inet_addr  needed#include <errno.h>#include <sys/ipc.h>                //shmget,shmctl needed#include <sys/shm.h>                //shmget,shmat,shmctl needed#include <stdio.h>                    //zlog neededvoid daemon_init(const char * pdic){ /* daemon_init 函数:   *        作用:  使程序成为守护进程;   *        参数:  pdic(const char *)        工作目录   *        返回值:无*///局部变量  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[]={"Hello! Are You Fine?\n"};//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);//}/* 服务器端开始建立socket描述符 */if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){printf("Socket error:%s\n\a",strerror(errno));exit(1);}/* 服务器端填充 sockaddr_in结构 */bzero(&server_addr,sizeof(struct sockaddr_in));server_addr.sin_family=AF_INET;//server_addr.sin_addr.s_addr=htonl(INADDR_ANY); /*IP地址转换为网络字节序*/server_addr.sin_port=htons(portnumber); /*端口号转换为网络字节序*/server_addr.sin_addr.s_addr=inet_addr("clinet-IP");/* 捆绑sockfd描述符 */if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1){printf("Bind error:%s\n\a",strerror(errno));exit(1);}/* 监听sockfd描述符 */if(listen(sockfd,5)==-1) /*5为请求队列的最大请求数*/{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);}/*inet_ntoa的作用是将一个32位Ipv4地址转换为相应的点分十进制数串*/printf("Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));/*相客户端发送hello字符数组的内容*/if(write(new_fd,hello,strlen(hello))==-1){printf("Write Error:%s\n",strerror(errno));exit(1);}/* 这个通讯已经结束 */close(new_fd);}/* while结尾处*/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);         } 



[解决办法]
没有什么问题,
你应该gdb跟踪一下.
或则把close(1),close(2)些先去掉.加上打印语句看看那退出了.

热点排行