linux C文件读取,进程启动

来源:互联网 发布:淘宝瑞士军刀包 编辑:程序博客网 时间:2024/06/04 00:26

一. linux c读取一个二进制文件.

1.1 封装的数据格式:

 typedef struct cap{            uint64 state;  //报文捕获进程状态            unsigned char file_name[50];//捕包文件名            uint64 packet_count; //捕包个数            uint64 time;//捕包时间            uint64 file_size;//cap包的大小 }capturer;

1.2 封装好的二进制文件:

1.3 解析的时候需要注意两个问题:


      我如果想要真确的拿到他的数据那么就必须按照他写数据的格式来解析;

     另一个问题就是大小端的问题,不同的CPU大小端不一致导致解析出错;

1.4 解析的基本思路

      打开这个数据,调用read(),先把整块的数据读出来放到一个buff里面。然后把buff的内容强制转换成上面定义的结构体类型。

      然后就可以按照正常的结构体来访问了。(为什么要这样强制类型转换?).

1.5 具体的实现代码

      1.5.1  首先定义一个相同格式的结构体:

 typedef struct captrue{       uint64 state;  //报文捕获进程状态       unsigned char file_name[50];//捕包文件名       uint64 packet_count; //捕包个数       uint64 time;//捕包时间       uint64 file_size;//cap包的大小}capturer,*p;char buff[88]={0};fdsrc = open (cap_data,O_RDONLY);//第一步打开文件nbytes = read(fdsrc,buff,100);//读取文件p = (capture *)buff; //强制类型转换p->state   //使用结构体成员.


二.读取一个linux某个目录下的文件名,并保存到一个字符串数组中

1.这种方法在windows下用比较好,在linux中会把linux中的: .  ..  这两个目录也读取到.

 #include<sys/types.h> #include<dirent.h> #include<unistd.h> #include<string.h>int main(){    DIR * dir;    struct dirent * ptr;    char file_list[100][40];    int i=0;    dir = opendir("/etc/rc.d"); //打开一个目录    while((ptr = readdir(dir)) != NULL) //循环读取目录数据    {        printf("d_name : %s\n", ptr->d_name); //输出文件名        strcpy(file_list[i],ptr->d_name ); //存储到数组        if ( ++i>=100 ) break;    }    closedir(dir);//关闭目录指针}


2.第二种方法就是把ls 的内容  >> 到一个.txt文件中然后再通过文件的读写方式把数据获取出来再放在数组中去使用:

#include<stdio.h>#include<sys/types.h>#include<dirent.h>#include<unistd.h>#include<string.h>int main(void){   char str[100][40];   File *fp;   int i = 0 ;   int n = 0;   fp = open("file.txt","r");   for(;;)   {      if(fgets(str[n],40,fp)  == NULL ) break;    str[n][strlen(str[n]) - 1] = '\0';    n++;   }   fclose(fp);   for(i=0;i<n;i++)   printf("%s\n",str[i]);   return 0;}


3.第三种方法,直接使用Linux下的两种文件结构体也可以实现,而且别上面的更科学不容易出错。

DIR *dir;struct stat *ptr = NULL;strcut dirent *entry =NULL;strcut file_msg *p = NULL;/*file_msg*/p = (strcut file_msg *)malloc(sizof(strcut file_msg));ptr = (struct stat *)malloc(sizeof(struct stat));if((dir = open(src)) == NULL){printf("can't open directory:%s\n",src);        return NULL;}chdir(src);int n=0;while((entry = readdir(dir)) != NULL){lstat(entry -> d_name,ptr);if(S_ISREG(ptr->st_mode)){strcpy(p->d_name[n],entry->d_name);p->d_size[n] = ptr->size;n++;}}


说明:

1.要自己定义一个结构体来存放文件名和文件大小,注意数据的长度;

2.将要读取的文件目录打开给文件指针DIR *dir ,然后读取该目录下的文件,把文件信息通过 lstat( ) 给结构体stat.(具体去看stat结构体的成员)
3.file_msg结构体定义:

typedef struct file_msg
{

char     d_name[MAX_CAP][40]; //文件名

unsigned  long  d_size[MAX_CAP]; //文件大小

} file_msg;


三.关于一个进程启动另一个进程的方法.(system函数)

1.网上的方法:

           http://blog.csdn.net/ljianhui/article/details/10089345

2.结合网上的方法自己封装了一个:

    说明:公司采用一个对shell简单的封装的脚本:schedtool
    然后采用system()来执行这个脚本,这个脚本再去启动其他进程


3.主要实现:(解决了system三种返回值的复杂情况,来保证sh的执行和另一个进程的启动)

int System_def(const char *cmd){int status = 0 ;status = system(cmd0);if(-1 ==  status ){printf("fucntion system() Error!\n");return -1;}     else     { if(WIFEXITED(status)) {     if(0 == WEXITSTATUS(status))             {return 0;     }     esle    { printf("shell Error! :%d\n",WEXITSTATUS(status));return -1;            } }else{printf("Exite faild :%d\n",WIFEXITED(status));return -1;            }}
 
原创粉丝点击