LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1682|回复: 6

C 读取文件数据--采用何种方法? 在线请教

[复制链接]
发表于 2007-11-21 10:03:30 | 显示全部楼层 |阅读模式
目的:
使用c开发一个系统,通过daemon程序从/proc/net/dev读取并统计流量,通过socket连接在server上读取daemon提供的流量信息并显示,通过gd库绘制图形。
大体的作法我也明白了,但我不知道从何下手。

所要读取的文件内容如下:
[root@www test]# vi /proc/net/dev

Inter-|   Receive                                                |  Transmit
face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:   52807     669    0    0    0     0          0         0    52807     669    0    0    0     0       0          0
  eth0:  968841    9359    0    0    0     0          0         0   139958    1330    0    0    0     0       0          0
  sit0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
~




我现在写了daemon程序,启用daemon监听
我需要在这个程序启动时:记录初始流入和流出数据量
每次连接端口时,客户端发送某个指令要求读取流入或者流出流量,daemon读取当前数据量,根据初始数据量计算流量返回给客户端,同时更新初始数据量值为当前数据量、
也就是图中的
eth  receive tiansmit 流量


daemon 代码如下:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <syslog.h>
#include <signal.h>
int daemon_init(void)
{ pid_t pid;
if((pid = fork()) < 0) return(-1);
else if(pid != 0) exit(0); /* parent exit */
/* child continues */
setsid(); /* become session leader */
chdir("/"); /* change working directory */
umask(0); /* clear file mode creation mask */
close(0); /* close stdin */
close(1); /* close stdout */
close(2); /* close stderr */
return(0); }
void sig_term(int signo)
{ if(signo == SIGTERM)
/* catched signal sent by kill(1) command */
{ syslog(LOG_INFO, "program terminated.");
closelog(); exit(0); }
}
int main(void)
{ if(daemon_init() == -1)
{ printf("can't fork self\n"); exit(0); }
openlog("daemontest", LOG_PID, LOG_USER);
syslog(LOG_INFO, "program started.");
signal(SIGTERM, sig_term); /* arrange to catch the signal */
while(1) { sleep(1); /* put your main program here */ }
return(0); }


我应该怎么写:
我在论坛当中也看到了不少相关的贴子,但我还是没有弄明白,应该怎么写。
我只知道OpenRead可以打开。
谁能帮忙写出一段吗???
 楼主| 发表于 2007-11-21 10:26:34 | 显示全部楼层
哦,如果我要写的话,我先要弄daemon ,写一个监听端口程序,并读取 proc/net/dev数据
回复 支持 反对

使用道具 举报

发表于 2007-11-21 12:02:10 | 显示全部楼层
Post by 守住每一天;1785465
哦,如果我要写的话,我先要弄daemon ,写一个监听端口程序,并读取 proc/net/dev数据


这不都已经知道了吗?写daemon程序,就查找daemon程序的资料,网上很多的。监听端口程序,就看网络编程;读取数据的话,看看正则表达式可能会容易点,glibc中就有对正则表达式的支持。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-21 13:42:22 | 显示全部楼层
Post by pupilzeng;1785513
这不都已经知道了吗?写daemon程序,就查找daemon程序的资料,网上很多的。监听端口程序,就看网络编程;读取数据的话,看看正则表达式可能会容易点,glibc中就有对正则表达式的支持。


daemon 监听端口我会了。但是如何 从文件中读取数据? 用什么函数?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-22 09:49:19 | 显示全部楼层
取数据大致可以如此进行:
启动时记录初始流入和流出数据量
每次连接端口时,客户端发送某个指令要求读取流入或者流出流量,daemon读取当前数据量,根据初始数据量计算流量返回给客户端,同时更新初始数据量值为当前数据量

这一步怎么操作?

用什么函数?
谁帮帮呀。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-22 15:12:37 | 显示全部楼层
#include <stdio.h>
man ()
{
FILE *fp;
fphzk=("/proc/nat/dev","rt");
if((fphzk=fopen("/proc/nat/dev","rb")==NULL)     
{
printf("\nerror on open /proc/nat/dev file!");  
getch();
exit(1);
}
printf("input a dev:\n");
ch=getchar();
while (ch!='\n')
{
fputc(ch,fphzk);
ch=getchar();
}
rewind(fphzk);
ch=fgetc(fphzk);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fphzk);
}
printf("\n");
fclose(fphzk);
}

我从DEV中读取文件,再写入到别一个文件,看看对不对???

着急了呀...来帮我看看吧.

还有一个问题,我是读取了文件,但我要如何过滤???只提取一些重要的信息.其它的不要.
回复 支持 反对

使用道具 举报

发表于 2007-11-22 15:27:11 | 显示全部楼层
Post by 守住每一天;1786139
#include <stdio.h>
man ()
{
FILE *fp;
fphzk=("/proc/nat/dev","rt");
if((fphzk=fopen("/proc/nat/dev","rb")==NULL)     
{
printf("\nerror on open /proc/nat/dev file!");  
getch();
exit(1);
}
printf("input a dev:\n");
ch=getchar();
while (ch!='\n')
{
fputc(ch,fphzk);
ch=getchar();
}
rewind(fphzk);
ch=fgetc(fphzk);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fphzk);
}
printf("\n");
fclose(fphzk);
}

我从DEV中读取文件,再写入到别一个文件,看看对不对???

着急了呀...来帮我看看吧.

还有一个问题,我是读取了文件,但我要如何过滤???只提取一些重要的信息.其它的不要.

读取文件,用fread,写文件用fwrite,这都是ANSI C库中的函数,随便哪本C语言的书都会讲到的。怎么过滤,我前面不是说过了吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表