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)些先去掉.加上打印语句看看那退出了.