linux 基础编程:文件操作总结

STM32 BLDC无刷电机霍尔信号捕获与换相控制实战解析 本文深入解析了STM32如何实现BLDC无刷电机的霍尔信号捕获与换相控制。详细阐述了硬件接口配置、定时器霍尔传感器模式的使用、抗干扰的滤波器与软件容错设计,以及中断服务与换相逻辑的实战代码。重点解决了信号抖动、换相不准等常见问题,旨在帮助开发者构建稳定可靠的电机驱动基础。 阅读详情

最近在看底层系统相关开源代码的时候,发现自己linux下面的基础编程真的没有过关,重新捧起《linux程序设计,第三版》好好学习一下基础编程,文件编程当然是第一站咯,今天看完,好好总结一下吧。

小条例

一切皆文件:在linux操作系统中,文件为操作系统服务和设备提供了一个简单而统一的接口,即一切皆文件。应用程序可以像使用文件一样使用磁盘文件,串行口,打印机和其他设备。目录也是一种特殊文件。

系统调用和标准库:在一个进程中,对文件进行访问可以包括两部分。第一部分通过调用“系统调用”或者设备驱动程序接口等相关函数,切换到内核空间,进行访问文件,该方法相对于函数调用来说,需要在用户代码和内核代码切换,效率底下(减小开销的方法:让每次系统调用完成尽可能多的功能,比如每次读取大量数据而不是一个字符)。第二部分是在用户空间里,调用标准库函数里面的函数来访问文件,标准库函数是在系统调用的基础上,提供了缓存功能,减少系统调用的次数,经而提供程序的效率。

文件描述符:在进程中,通过文件描述符来关联已经打开的文件,文件描述符是一个小值整数,通过文件描述符,可以访问已经打开的文件或者设备。在程序启动时候,默认打开3个描述符:0:标准输入,1:标准输出,2:标准错误。在标准库中通过FILE *结构体来封装文件描述,对应默认的三个描述符:stdin,stdout,stderr。

文件操作头文件

#include<stdio.h>//标准库头文件
#include<dirent.h>//目录相关操作函数
#include<unistd.h>//文件系统调用相关函数
#include<sys/stat.h>//文件属性相关标志位的宏定义
#include<sys/types.h>//linux标准类型定义和宏定义
#include<errno.h>//错误代码

文件stat属性结构

文件stat结构:该结构中包含了文件属性信息,可以通过下面函数进行得到

#include <unistd.h>
#inlcude <sys/stat.h>
#include <sys/types.h>

int fstat(int fildes,struct stat *buff);
int stat(const char *path,struct stat *buff);
int lstat(const char *path,struct stat *buff);
stat和lstat以文件目录为参数,如果文件是符号链接时,lstat返回的是符号链接信息,而stat返回原始文件的信息。其他情况下面,两个函数返回结果一样,下面主要分析一下stat结构,首先看stat结构体:

struct stat
{
    dev_t       st_dev;     /* 文件所在设备的ID*/
    ino_t       st_ino;     /* iinode节点信息*/
    mode_t      st_mode;    /* 文件权限和文件类型信息*/
    nlink_t     st_nlink;   /* 链向此文件的连接数(硬连接)*/
    uid_t       st_uid;     /* user id*/
    gid_t       st_gid;     /* group id*/
    dev_t       st_rdev;    /* 设备号,针对设备文件*/
    off_t       st_size;    /* 文件大小,字节为单位*/
    blksize_t   st_blksize; /* 系统块的大小*/
    blkcnt_t    st_blocks;  /* 文件所占块数*/
    time_t      st_atime;   /* 最后一次访问时间*/
    time_t      st_mtime;   /* 内容最后一次修改时间*/
    time_t      st_ctime;   /* 文件的权限,属组或内容最后一次修改的时间- */
};
其中mode_t是一个比较重要的内容,它存储了文件类型和文件权限相关信息。下面对其进行一个简单分析

mode_t是32位的整形变量类型,各位代表的信息如下。

           S_IFMT     0170000   利用该掩码来检查文件类型
           S_IFSOCK   0140000   socket文件
           S_IFLNK    0120000   符号链接文件
           S_IFREG    0100000   正常文件
           S_IFBLK    0060000   特殊的块设备文件
           S_IFDIR    0040000   目录
           S_IFCHR    0020000   特殊的字符设备文件
           S_IFIFO    0010000   管道文件
           S_ISUID    0004000   UID位
           S_ISGID    0002000   group-ID位
           S_ISVTX    0001000   sticky位
           S_IRWXU    00700     利用该掩码来检查属主权限
           S_IRUSR    00400     属主有读权限
           S_IWUSR    00200     属主有读权限
           S_IXUSR    00100     属主有写权限
           S_IRWXG    00070     利用该掩码来检查属组权限
           S_IRGRP    00040     属组有读权限
           S_IWGRP    00020     属组有读权限
           S_IXGRP    00010     属组有读权限
           S_IRWXO    00007     利用该掩码来检查其他用户权限
           S_IROTH    00004     其他用户有读权限
           S_IWOTH    00002     其他用户有读权限
           S_IXOTH    00001     其他用户有读权限
可以通过位算法来得到具体信息比如:(mode & S_IRWXU)==S_IXUSR来判断是否有执行的权限。另外可以通过下面宏函数进行相应的检查,返回boolean类型:

           S_ISREG(m)  是否为正常文件
           S_ISDIR(m)  是否为目录
           S_ISCHR(m)  是否为字符设备
           S_ISBLK(m)  是否为块设备
           S_ISFIFO(m) 是否为管道文件
           S_ISLNK(m)  是否为符号链接文件
           S_ISSOCK(m) 是否为socket文件

文件访问模式

可以通过系统调用和标准库两种方式打开文件,两种打开i方式分别对应了一些访问模式

系统调用:

O_RDONLY:只读 
O_WRONLY:只写
O_RDWR:读写
O_APPEND:附加在文档后面 
O_ASYNC:启动IO的信号变量,
O_CLOEXEC: 
O_CREAT:文件创建 
O_DIRECT (Since Linux 2.4.10):直接IO,减小缓存对文件内容的影响。但是会影响系统性能。 
O_DIRECTORY:不建议使用
O_EXCL :与O_CREAT一起,确定open操作为原子操作。保证文件创建成功,如果两个程序同时创建文件,并且文件已经存在,那么返回错误 
O_LARGEFILE 
O_NOATIME 
O_NONBLOCK:非阻塞的方式打开
O_NOFOLLOW 
O_TRUNC将文件长度设为零,丢弃现有文件       

标准库:
r或者rb:只读
w或者wb:只写
a或者ab:追加模式
r+或者rb+或者r+b,以修改的方式打开
w+或者wb+或者w+b,以修改的方式打开,并且设置文件长度为0
a+或者ab+或者a+b,一修改的方式打开,并且内容追家在文件尾部
其中b为二进制文件,否则为字符文件

文件锁

在多个进程在操作同一个文件时,防止操作互相覆盖,需要采用文件锁的机制来解决文件的操作的冲突。linux下面提供了两种锁:锁文件和文件段锁。下面分别介绍一下两种锁

锁文件

多个进程操作同一个文件最直观的方法是:对每一个需要锁的文件创建一个全局的互斥“元素”,只有一个进程“获得”该元素,才可以操作文件,操作结束以后必须释放该元素。本节,我们把该元素叫着“锁文件”。linux的系统调用open函数可以通过创建一个系统唯一的文件来充当锁文件,该操作必须是原子操作,操作完以后,删除该锁文件。实例程序如下:
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
	int file_desc;
	file_desc=open("file.in.lck",O_RDWR|O_CREAT|O_EXCL,S_IWUSR|S_IWGRP|S_IWOTH);
	if(file_desc==-1){
		printf("wrong\n");
		return 0;
	}
	//锁文件创建好了,下面就是临界区
	write(file_desc,"lck",3);
	close(file_desc);
	unlink("file.in.lck");
	//临界区结束
	return 1;
}

利用锁文件一般都用来控制诸如串行口之类的资源的独占式方法。但是不适合访问大型的共享文件。如果多个进程只需要操作文件一部分,采用锁文件效率底下。因此才有了文件段锁机制的存在。

文件段锁定

文件段锁定或者文件区锁定指的是通过文件中的锁定区域,实现文件部分锁定。linux提供两种方式fcntl系统调用和lockf调用。lockf调用是fcntl的替代接口,但是由于两者在底层实现机制不同,不允许混合使用两种类型的调用。

#include <unistd.h>
int lockf(int fd, int cmd, off_t len);
其中cmd参数有:
//F_LOCK 设置锁,并且阻塞等待。 
//F_TLOCK:设置锁,但是立即返回,如果加锁失败,返回错误
//F_ULOCK解锁指定文件的一部分。
//F_TEST 锁测试

#include <unistd.h>
#include <fcntl.h>
nt fcntl(int fd, int cmd, struct flock *flock_structure);
其中cmd参数有:
F_GETLK:获得文件描述符fd打开的文件的锁信息。它不会尝试的去锁定文件。该函数通过设置flock结构来表明它可能需要的锁类型并定义感兴趣区域。如果调用成功,返回一个非-1值,如果文件已被锁定,应用程序会读取有关信息,并覆盖flock结构,调用应用程序可以检查flock中的l_pid来检查flock是否修改过来判断锁的状态。
F_SETLK:对fd的某个区域进行加锁或解锁。如果成功执行返回-1,该函数是立即返回。
F_SETLKW:和F_SETLK一样,但是会一直等待执行结果。
程序结束以后会自动清楚各种锁
flock结构:
struct flock
{
       short int l_type; 
       short int l_whence;
       #ifndef __USE_FILE_OFFSET64
              __off_t l_start; 
              __off_t l_len; 
       #else
              __off64_t l_start; 
              __off64_t l_len; 
       #endif
       __pid_t l_pid; 
};
结构体中l_type 是文件锁定的类型有F_RDLCK共享性读锁定,F_WRLCK独占性写锁定和F_UNLCK释放锁定
成员 l_whence 和lseek类似,有几个可选的参数 SEEK_SET 文件头 SEEK_CUR当前位置SEEK_END文件末尾该字段设定锁定的区域的启始地址
区域的长度 l_len 也就是锁定的长度若该值为0则表示锁定的区域从其起点开始(由l_start和l_whence决定)开始直至最大可能位置为址!该值不能在文件的起始位置之前开始或越过该超始位置。为了锁定整个文件,通常的做法是将l_start说明为0,l_whence说明为SEEK_SET,l_len说明为0

相关函数

系统调用

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
int close(int fd);

flags和mode参数见上方相关描述。对于两个进程同时打开了一个文件,会出现操作彼此覆盖问题,解决该问题的方法是文件锁。

ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
两个函数都返回的是实际读写的大小,如果返回-1,表示出现了错误。

int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);

详细见上面

off_t lseek(int fd, off_t offset, int whence);
设置读写指针,返回从文件头到当前设置处的偏移值,如果为-1表示出现错误。设置的方法可以相对当前位置,相对结束位置,绝对位置。分别对于whence(SEEK_CUR,SEEK_END,SEEK_SET)。

int dup(int oldfd);
int dup2(int oldfd, int newfd);
文件描述符的复制功能。在管道通信里面,该功能比较好

int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
可以改变文件或者目录的访问权限。

int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
改变用户ID和组ID。

int symlink(const char *oldpath, const char *newpath);
int link(const char *oldpath, const char *newpath);
int unlink(const char *pathname);
symlink和link分别创建符号链接和硬链接。unlink删除一个链接,当一个文件的连接数为0,才标识删除相应文件。

【硬连接】
硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

【软连接】
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。 

int mkdir(const char *pathname, mode_t mode);
int rmdir(const char *pathname);
创建和删除目录

int chdir(const char *path);
int fchdir(int fd);
char *getcwd(char *buf, size_t size);
char *getwd(char *buf);
char *get_current_dir_name(void);
得到或者改变当前工作目录。

标准函数库

stdio.h
FILE *fopen(const char *path, const char *mode);
int fclose(FILE *fp);
int remove(const char *pathname);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
int fflush(FILE *stream);

int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
void rewind(FILE *stream);
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);

int fgetc(FILE *stream);
char *fgets(char *s, int size, FILE *stream);
int getc(FILE *stream);
int getchar(void);
char *gets(char *s);
int ungetc(int c, FILE *stream);

int fputc(int c, FILE *stream);
int fputs(const char *s, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
int puts(const char *s);

int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);

int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);

dirent.h
DIR *opendir(const char *name);
DIR *fdopendir(int fd);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
void seekdir(DIR *dirp, long offset);
long telldir(DIR *dirp);

系统调用和标准库之间的转换

FILE *fdopen(int fd, const char *mode);
int fileno(FILE *stream);

每一个系统调用的底层描述符和标准库的FILE对象之间都是相关联的。fileno如果失败,返回-1

错误处理

在系统调用和标准库的处理时候,都有各种原因导致错误,失败时,通过设置外部变量errno的值来指明失败的原因。因此程序必须在函数报错之后立即检查errno变量,防止错误被覆盖。man errno可以查到具体的错误代码,其中下面属于比较常见的错误:

EPERM  操作不允许
ENOENT 文件或者目录不存在
EINTR 系统调用被中断
EIO IO错误
EBUSY 设备或资源忙
EEX_IST 文件存在
EINVA_L 无效参数
EMFILE 打开文件过多
ENODEV 设备不存在
EISDIR 是一个目录
ENOTDIR 不是一个目录

上面的错误只是一个代码,可以通过下面的函数使其在说明之间转换

#include <string.h>
#include <errno.h>
extern int errno;
char *strerror(int errnum);
void perror(const char *s);
其中strerror可以在实现转换。perror把error变量中报告的当前错误映射为一个字符串,并把它输出到标准错误输出。输入格式(s:[空格] 具体错误内容)

深入阅读

柳大的Linux讲义·基础篇(1)磁盘与文件系统   http://blog.youkuaiyun.com/poechant/article/details/7214673

柳大的Linux讲义·基础篇(2)Linux文件系统的inode http://blog.youkuaiyun.com/poechant/article/details/7214926

柳大的Linux讲义·基础篇(3)权限、链接与权限管理 http://blog.youkuaiyun.com/poechant/article/details/7215038


招标信息爬取工具 一个能帮你节省大量时间的实用小工具,我自己用了挺久,分享出来给有需要的朋友 阅读详情

相关推荐

自由曲面与衍射光学元件DOE:从基础理论到工业应用的全景解析

本文全景解析了自由曲面与衍射光学元件的核心理论与工业应用。文章深入探讨了自由曲面在非对称光学设计中的灵活性及其数学描述与制造挑战,并阐述了衍射光学元件通过微纳结构进行波前相位调制的原理与多样化功能。两者与经典光学互补融合,共同构成了高端成像、智能照明、激光加工及AR/VR等前沿领域的底层技术支柱。

devops8pract的博客 390

Linux 创建文件的12种方法总结

命令通常用于脚本、批处理文件。命令可以创建一个新的文件,该命令回车后不会立即结束,可以输入添加到新文件的内容后按 Ctrl+C 或者 Ctrl+D 来结束,也可以使用。通常用于将一个命令的输出重定向到一个新文件中,如果没有命令,则会创建一个 0KB 的空文件。of=文件名:输出文件名,缺省为标准输出。if=文件名:输入文件名,缺省为标准输入。ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。

天天的博客 3万+

宝塔部署若依前端出现502解决方法

若依系统是一个基于Java语言的开源项目,旨在帮助开发者减少开发时间,特别适用于需要快速开发出一套具有用户管理、菜单管理、权限管理、定时任务、日志管理等功能的简单系统。系统分为前后端分离、分布式等架构前后端分离部署教程然而通过宝塔来部署若依系统会遇见一些问题,特此在这里记录一下。

m0_74823683的博客 776

【Linux系统编程】文件编程

文件编程就是指对文件进行创建、打开、关闭、读、写、编辑等操作,而如何运用?本文将在Linux系统下进行详细的介绍,注重应用。其中包含了open函数,read函数,write函数,lseek光标移动;标准C库文件操作调用,包含fopen,fread,fwrite,fseek等用法,及open与fopen的区别。

v13111329954的博客 1567

统信UOS上Qt5.12.8离线安装保姆级教程(避坑网络登录与GCC选择)

本文提供统信UOS系统下Qt5.12.8离线安装的完整教程,涵盖环境准备、安装步骤、常见问题解决及开发优化建议。特别针对无网络环境下的登录验证跳过、GCC版本匹配等关键问题提供解决方案,帮助开发者快速搭建稳定的Qt开发环境。

weixin_30666401的博客 462

避坑指南:ZYNQ PS端读写BRAM时容易忽略的5个配置细节(基于Vivado 2022.1)

本文基于Vivado 2022.1,总结了ZYNQ PS端读写单口BRAM时5个易被忽略的关键配置细节。内容涵盖关闭Safety Circuit以优化时序、精确匹配AXI控制器与BRAM的地址深度、注意PS端函数位宽与地址对齐、正确连接时钟复位域,并提供了实用的调试技巧与诊断代码,帮助工程师规避常见陷阱,确保数据交互稳定可靠。

net55的博客 374

轻松上手Linux文件操作:五种方法教你创建文件

本文介绍五种在Linux系统中创建文件的方法,包括使用touch命令、使用文本编辑器创建文件、使用echo命令创建文件、使用cat命令创建文件以及使用重定向符号创建文件。全面了解并掌握在Linux系统中创建文件的各种常用方法。

Lion_Long的博客 2万+

贝叶斯机器学习在吸附量预测中的应用

本文介绍了贝叶斯机器学习在吸附量预测中的应用。通过Python实现完整的贝叶斯建模流程,包括数据生成、预处理、模型构建与评估。文章对比了贝叶斯与频率学派的差异,详细阐述了贝叶斯线性回归和神经网络的实现方法,并提供了数据可视化、模型诊断等技术细节。该方法不仅能预测吸附量,还能量化预测不确定性,为工程决策提供更全面的依据。全文超过6000字,结合理论推导与代码实践,是应用贝叶斯方法解决实际工程问题的完整指南。

AI的内部世界的博客 166

linux系统编程——文件编程

标题linux系统编程——文件编程 ps:本文为本人学习记录所用 一、如何创建、修改一个文件 手动修改文件:打开/创建文件→编辑文件→保存文件→关闭文件 linux中使用编程来操作文件,但真正了解如何文件编程是很复杂的,但可以引用系统提供的API 二、linux系统调用的API API名称 操作名 手册命令 打开 open man 2 open 创建 creat man 2 creat 读操作 read man 2 read 写操作 write man 2 write 光标定

admin_plmm的博客 4924

Esp32蓝牙Hid调用方案 http执行设备、鼠标、键盘相关操作

本文主要介绍 Esp32 蓝牙 Hid 相关的多种操作方式,详细的设备、鼠标、键盘相关操作的 http 调用方法。下面是整理出的所有 http 调用方法和 rhino 引擎方式。本机调用的话直接使用http://localhost:8080 如果是局域网调用则使用软件里的地址 比如我的是http://192.168.1.5:8080。文件地址: https://www.123865.com/s/Qtm4jv-xyZbd?使用前需要一块烧录好的ESP32板子并在手机安装好embedded软件用于蓝牙通信。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 569

【天工Godwork精品教程】天工3.1.7安装教程(附Godwork完整版下载地址)

本文讲解天工3.1.7安装过程(附Godwork完整版网盘下载地址)。 一、天工3.1.7安装教程 1. 安装GodWork-AT 3.1.7 2. 安装GodWork-AT 3.1.7补丁 3. 安装GodWork-EOS-Setup-2017B-1231 4. 安装GodWork-EOS补丁 5. 运行godwokr软件 6. 生成ZC码 7. 输入ZC码 8. eos插

智慧空间实验室 5283

【Linux】指令合集

数字类型改变档案权限:例如chmod 755 文件名,其中7表示文件所有者的权限(4表示可读,2表示可写,1表示可执行,7 = 4+2+1),5表示所属组的权限(4+1),5表示其他用户的权限。tar -N ‘2007/03/01’ -zcvf home.tar.gz /home:在/home当中,比2007/03/01新的文件才备份成home.tar.gz。用法示例:dirname 路径:提取路径中的目录名,如dirname /home/user/file.txt会得到/home/user。

奥利文儿的博客 2074

YOLOv8 | 代码逐行解析(一) | 项目目录构造分析

Hello,大家好这次给大家带来的不是改进,是整个YOLOv8项目的分析,整个系列大概会更新7-10篇左右的文章,从项目的目录到每一个功能代码的都会进行详细的讲解,同时YOLOv8改进系列也突破了三十篇文章,最后预计本专栏持续更新会在年底更新上百篇的改进教程, 所以大家如果没有订阅专栏可以提前订阅以下。下面开始进行YOLOv8逐行解析的一篇——项目目录构造分析在这里给大家推荐我的YOLOv8改进有效涨点专栏,本专栏目前为新开的平均质量分98分,后期我会根据各种最新的前沿顶会进行论文复现,。

Snu77的博客 4万+

Linux系统编程基础:文件操作实战

在Linux系统中,文件操作是一项基本而重要的任务。本文将通过一系列示例代码,介绍如何在Linux环境下使用C语言进行文件的创建、打开、关闭、读取、写入和定位操作。最后,我们将通过一个小项目来综合应用这些知识,实现一个简单的ini配置文件的读写功能。

宁可搬砖百片,不造轮子一边的博客 844

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Linux编程基础 2.2:文件操作

1 文件操作 stat() access() chmod() truncate() link() 1.1 stat函数 #include <sys/stat.h> int stat(const char *path, struct stat *buf); 功能:用于获取文件的属性; 参数说明: path:文件路径; buf:接收获取到的文件属性;文件属性存储在inode中,函数从inode结构体中获取文件信息。 返回值说明: 成功:0 不成功:-1并设置errno 【案例1】使用sta

爱学习爱运动的专栏 1542

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

系统级程序设计(Linux编程基础 2.2:文件操作&Linux编程基础 3.1:进程管理)

文章目录 Linux编程基础 2.2:文件操作 一、函数 stat() access() chmod() truncate() link() 1.1 stat函数 #include <sys/stat.h> int stat(const char *path, struct stat *buf); 功能:用于获取文件的属性; 参数说明: path:文件路径; buf:接收获取到的文件属性;文件属性存储在inode中,函数从inode结构体中获取文件信息。 使用此函数,用返回值.

LeonardoStewart的博客 274

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【Linux 系统编程】文件操作核心知识点:标准 IO 与文件基础

先通过fopen打开文件并指定操作模式,再根据场景选择字符级(fputc/fgetc)、行级(fputs/fgets)或块级(fread/fwrite)读写,最后通过fclose释放资源;理解 Linux 文件类型和 man 手册的用法,是解决文件操作问题的关键;命令行参数则是扩展文件操作程序灵活性的基础(如指定待操作的文件路径)。掌握这些知识点,即可覆盖绝大多数文本 / 二进制文件的读写场景,也是后续学习高级文件操作(如系统调用)的基础。

2301_77424087的博客 809

【Linux C 编程】标准 IO 详解与实战:从基础接口到文件操作实战

标准 IO(Standard I/O)是 C 语言提供的一套文件操作接口,封装了底层的系统调用(如 read/write),并引入缓存机制提升 IO 效率。相比系统调用,标准 IO 具有跨平台性强、使用简单、缓存优化等优势,是 Linux C 编程中文件操作的首选方式。标准 IO 是 Linux C 编程中文件操作的核心工具,其核心优势在于缓存机制和跨平台性。

2401_85893688的博客 695

Linux编程基础 2.2:文件操作和Linux编程基础 3.1:进程管理-1(第二课)

文章目录 前言 一、文件操作 二、进程控制 1.创建进程 2.创建多个进程 3.进程的执行顺序:利用sleep函数,暂缓进程执行 前言 本节课学习了有关文件操作剩余的一些函数以及进程控制。 一、文件操作 stat() access() chmod() truncate() link() (1)stat函数 功能:用于获取文件的属性 #include <sys/stat.h> int stat(const char *path, struct stat *.

weixin_51832654的博客 628

【Linux系统编程】文件操作基础:C标准库、系统调用、fd是什么和fd与FILE*的关系

本文介绍了Linux文件操作的基础知识,从C标准库文件操作函数到Linux系统调用。主要内容包括: 文件的本质是文件内容+文件属性,文件操作需通过系统调用由操作系统完成。 C标准库提供基于文件指针(FILE*)的文件操作函数,包括fopen/fclose、字符/字符串IO、格式化IO、二进制IO、文件定位等。 Linux系统调用使用文件描述符(整数)操作文件,标准输入/输出/错误分别对应文件描述符0、1、2。

分享 AI 时代程序员的进阶之路:大模型应用、AI 编程工具实战,同时沉淀 C / Linux 底层技术笔记。与君共赴,万里征途。 4534

Linux编程基础 2.2:文件操作&3.1:进程管理-1(学后心得)

文件操作 文章目录 stat() access() chmod() truncate() link() 1.1 stat 函数 #include <sys/stat.h> int stat(const char *path, struct stat *buf); 用于获取文件的属性 参数说明: path:文件路径; buf:接收获取到的文件属性;文件属性存储在inode中,函数从inode结构体中获取文件信息。 返回描述: 成功:0 不成功:-1并设置.

m0_58233529的博客 276

《Linux 编程指南 第三版》资源文件介绍

《Linux 编程指南 第三版》资源文件介绍 【下载地址】Linux编程指南第三版资源文件介绍 《Linux 编程指南 第三版》是一份全面且实用的Linux编程学习资料,专为有一定编程基础的开发者设计。内容涵盖进程管理、文件操作、网络编程等核心知识点,深入浅出地讲解Linux环境下的编程技巧。这份资料经过实践验证,结构清...

gitblog_06742的博客 450

linux操作系统下c语言编程入门

 (一)目录介绍1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 7)Linux程序设计入门--线程操作 8)Linux程序设计入门--网络编程 9)Linux下C开发工

jilily的专栏 1402

Linux系统编程

linux系统编程

杨泽彬的神秘商店 777

【Linux | 系统编程】01 Linux基础命令与编译工具链

本文梳理了 Linux 体系结构、核心 shell 命令、编译工具链三大模块,涵盖内核、系统调用、文件目录操作、编译调试、Makefile 及静态 / 动态库等关键知识点。

m0_62539997的博客 1110

TCP/IP网络编程笔记Chapter I -1基于Linux的文件操作

TCP/IP网络编程笔记Chapter I -1基于Linux的文件操作1.总述(1)打开文件(2)关闭文件(3)写入文件2.应用(1)创建文件并保存数据(2)通过read函数读取data.txt中保存的数据 1.总述 Linux下一切都是文件 ,对于文件的操作,我们需要用文件操作符来指定。文件一般经过创建过程才会分配文件描述符,可以把它理解为方便称呼操作系统创建的文件而赋予的数。 文件描述符fd 对象 0 标准输入 1 标准输出 2 标准错误 (1)打开文件 需要的头文件:#i

shi_xiao_xuan的博客 403
上一篇: FastCGI: A High-Performance Web Server Interface 中文翻译版本
下一篇: linux基础编程:进程基础总结
ColZer
博客等级 码龄14年 42粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值