×

linux fseek

linux fseek(Linux下怎么读取多个进程的信息)

admin admin 发表于2024-01-10 01:58:55 浏览32 评论0

抢沙发发表评论

大家好,linux fseek相信很多的网友都不是很明白,包括Linux下怎么读取多个进程的信息也是一样,不过没有关系,接下来就来为大家分享关于linux fseek和Linux下怎么读取多个进程的信息的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

本文目录

Linux下怎么读取多个进程的信息

首先说说DIR这一结构体,以下为DIR结构体的定义:struct __dirstream { void *__fd; char *__data; int __entry_data; char *__ptr; int __entry_ptr; size_t __allocation; size_t __size; __libc_lock_define (, __lock) }; typedef struct __dirstream DIR;DIR结构体类似于FILE,是一个内部结构,以下几个函数用这个内部结构保存当前正在被读取的目录的有关信息(摘自《UNIX环境高级编程(第二版)》)。函数 DIR *opendir(const char *pathname),即打开文件目录,返回的就是指向DIR结构体的指针,而该指针由以下几个函数使用:struct dirent *readdir(DIR *dp); void rewinddir(DIR *dp); int closedir(DIR *dp); long telldir(DIR *dp); void seekdir(DIR *dp,long loc);关于DIR结构,我们知道这么多就可以了,没必要去再去研究他的结构成员。接着是dirent结构体,首先我们要弄清楚目录文件(directory file)的概念:这种文件包含了其他文件的名字以及指向与这些文件有关的信息的指针(摘自《UNIX环境高级编程(第二版)》)。从定义能够看出,dirent不仅仅指向目录,还指向目录中的具体文件,readdir函数同样也读取目录下的文件,这就是证据。以下为dirent结构体的定义:struct dirent { long d_ino; /* inode number 索引节点号 */    off_t d_off; /* offset to this dirent 在目录文件中的偏移 */    unsigned short d_reclen; /* length of this d_name 文件名长 */    unsigned char d_type; /* the type of d_name 文件类型 */    char d_name ; /* file name (null-terminated) 文件名,最长255字符 */ }然后是怎么使用它读取进程信息。可以用这些函数来读取/proc下的文件夹,然后做一个判断,只要文件夹的名字开头是1-9的,就进入目录读取其中的status文件,然后输出信息。代码#include 《stdio.h》#include 《dirent.h》#include 《unistd.h》#include 《stdlib.h》typedef struct{pid_t pid;char name;//进程名称int vmsize;//虚拟内存信息}proc_info_st;//保存读取的进程信息#define PROC_NAME_LINE 1//名称所在行#define PROC_PID_LINE 4//pid所在行#define PROC_VMSIZE_LINE 12//虚拟内存所在行#define BUFF_LEN 1024 //行缓冲区的长度#ifndef TRUE# define TRUE 1#endif#ifndef FALSE# define FALSE 0#endifvoid read_proc(proc_info_st* info,const char* c_pid);//读取进程信息int read_line(FILE* fp,char* buff,int b_l,int l);//读取一行int main(){//打开目录DIR *dir;struct dirent *ptr;if (!(dir = opendir("/proc")))return 0;//读取目录while (ptr = readdir(dir)){//循环读取出所有的进程文件if (ptr-》d_name 《= ’9’){//获取进程信息proc_info_st info;read_proc(&info,ptr-》d_name);//读取信息printf("pid:%d\npname:%s\nvmsize:%d\n",info.pid,info.name,info.vmsize);printf("\n\n");//再空两行}}}/****************************************************说明:根据进程pid获取进程信息,存放在proc_info_st结构体中****输入:** /proc_info_st* info 返回进程信息** /char* c_pid 进程pid的字符串形式*******************************************************/void read_proc(proc_info_st* info,const char* c_pid){FILE* fp = NULL;char file = {0};char line_buff = {0};//读取行的缓冲区sprintf(file,"/proc/%s/status",c_pid);//读取status文件if (!(fp = fopen(file,"r"))){printf("read %s file fail!\n",file);return;}char name;//先读取进程名称if (read_line(fp,line_buff,BUFF_LEN,PROC_NAME_LINE)){sscanf(line_buff,"%s %s",name,(info-》name));}fseek(fp,0,SEEK_SET);//回到文件头部//读取进程pidif (read_line(fp,line_buff,BUFF_LEN,PROC_PID_LINE)){sscanf(line_buff,"%s %d",name,&(info-》pid));}fseek(fp,0,SEEK_SET);//回到文件头部//读取进程vmsizeif (read_line(fp,line_buff,BUFF_LEN,PROC_VMSIZE_LINE)){sscanf(line_buff,"%s %d",name,&(info-》vmsize));}fclose(fp);}/****************************************************说明:读取文件的一行到buff****输入:** /FILE* fp 文件指针** /char* buff 缓冲区** /int b_l 缓冲区的长度** /l 指定行****输出:** /true 读取成功** /false 读取失败*************************************************/int read_line(FILE* fp,char* buff,int b_l,int l){if (!fp)return FALSE;char line_buff;int i;//读取指定行的前l-1行,转到指定行for (i = 0; i 《 l-1; i++){if (!fgets (line_buff, sizeof(line_buff), fp)){return FALSE;}}//读取指定行if (!fgets (line_buff, sizeof(line_buff), fp)){return FALSE;}memcpy(buff,line_buff,b_l);return TRUE;}***隐藏网址***

LINUX C语言,在文本中某一行插入内容,最好有程序

这个不能直接插入, 因为数据在文件中存储是顺序存储的, 你插入的数据会覆盖掉后面的内容, 只有把插入点位置后面的数据都读取出来存着, 然后在文件指针处插入你要写的数据, 最后将你保存的数据再写到文件, 才能实现真正的插入到文件.以下代码实现将文件中第6行处插入一行, 即原来的第6行以后依次往后移一行.#include 《stdio.h》int main(void){ FILE *fp; int i; char buf;// 假设每行不超过1024字节, 根据情况调节大小 if (!(fp = fopen("./a.txt", "r+"))) {// 尝试以读写方式打开文件. fprintf(stderr, "Open failed.\n"); return 1; } for (i = 0; i 《 5; i++) { // 循环5次, 读掉前5行 fgets(buf, 1024, fp); // 读取一行 } // 此时文件指针指向第6行行首 long offset = ftell(fp); // 记录文件指针位置, 因为后面还要读, 文件指针会移走 // 这里为了程序易懂, 假设后面不超过100行, 每行不超过1024字节, 否则需要用链表或二重 //指针的方式, 可以保证不浪费空间, 但代码就较复杂 char save; i = 0; // 清0, 记录后面共有多少行 while ((fgets(save, 1024, fp))) { // 循环读取文件, 直到fgets返回NULL表示读完 i++; } printf("请输入要插入的数据内容:"); fgets(buf, 1024, stdin); // 接收键盘输入的内容 // 由于读完文件后, 文件指针指向文件尾, 这里重新定位到之前保存的位置 fseek(fp, offset, SEEK_SET); fputs(buf, fp);// 写要插入的数据 int j; for (j = 0; j 《 i; j++) {// 之前保存的数据, 依次往后面写 fputs(save, fp); } return 0;}

linux 下如何知道一个文件是关闭状态

下面是读取一个文件 并复制成新文件#include 《string.h》#include 《strings.h》#include 《stdio.h》#include 《stdlib.h》#define BUFFER_SIZE 1024int main(int argc, char **argv){ FILE *from_fd; FILE *to_fd; long file_len = 0; char buffer; char *ptr; //判断传入参数 if(argc != 3) { printf("Usage: %s fromfile tofile", argv); exit(1); //异常退出返回1 } //打开原文件 if((from_fd = fopen(argv, "rb")) == NULL) { printf("Read %s Error\n", argv); exit(1); } //创建目的文件 if((to_fd = fopen(argv, "wb")) == NULL) { printf("Write %s Error\n", argv); exit(1); } //侧得文件大小 fseek(from_fd, 0L, SEEK_END); file_len = ftell(from_fd); fseek(from_fd, 0L, SEEK_SET); printf("from file size is = %ld\n", file_len); //进行文件拷贝 while(!feof(from_fd)) { fread(buffer, BUFFER_SIZE, 1, from_fd); //fread 为c标准库里函数 // read 为Linux系统调用, 返回成功读取了多少字节 出错则返回-1 if(BUFFER_SIZE 》= file_len) { fwrite(buffer, file_len, 1, to_fd); } else { fwrite(buffer, BUFFER_SIZE, 1, to_fd); file_len = file_len - BUFFER_SIZE; printf("copy success!\n"); } bzero(buffer, BUFFER_SIZE); } fclose(from_fd); fclose(to_fd); exit(0); //返回0 表示成功}

关于linux fseek,Linux下怎么读取多个进程的信息的介绍到此结束,希望对大家有所帮助。