C语言:文件系统

news2024/11/24 19:10:29

一、目录和文件

在当前目录下使用touch 创建一个名为 -a的文件:
touch -a ;  // 错误,
touch -- -a//正确
touch ./-a 正确

ls -n可以看到对象的用户id,可以在/etc/passwd中查看,/etc/group可以看到组号

获取文件属性

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

       int stat(const char *pathname, struct stat *statbuf);
       int fstat(int fd, struct stat *statbuf);
       int lstat(const char *pathname, struct stat *statbuf);

       #include <fcntl.h>           /* Definition of AT_* constants */
       #include <sys/stat.h>

       int fstatat(int dirfd, const char *pathname, struct stat *statbuf,
                   int flags);

         struct stat {
               dev_t     st_dev;         /* ID of device containing file */ 包含这个文件的设备ID号
               ino_t     st_ino;         /* Inode number */   ls -i可以看到inode号
               mode_t    st_mode;        /* File type and mode */ 权限信息(16位)
               nlink_t   st_nlink;       /* Number of hard links */ 硬链接数
               uid_t     st_uid;         /* User ID of owner */ 用户id
               gid_t     st_gid;         /* Group ID of owner */ 组id
               dev_t     st_rdev;        /* Device ID (if special file) */ 设备的ID号
               off_t     st_size;        /* Total size, in bytes */ 字节数
               blksize_t st_blksize;     /* Block size for filesystem I/O */ 块大小,一般512B
               blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */ 占的块数

               /* Since Linux 2.6, the kernel supports nanosecond
                  precision for the following timestamp fields.
                  For the details before Linux 2.6, see NOTES. */

               struct timespec st_atim;  /* Time of last access */  上次访问时间
               struct timespec st_mtim;  /* Time of last modification */上次修改时间
               struct timespec st_ctim;  /* Time of last status change */上次改变时间

           #define st_atime st_atim.tv_sec      /* Backward compatibility */
           #define st_mtime st_mtim.tv_sec
           #define st_ctime st_ctim.tv_sec
           };

stat命令也可以查看信息

stat

将文件属性信息填入statbuf结构体,成功返回0.失败返回-1

fstat

传入文件描述符整形

lstat

传入链接文件

#include <stdlib.h>
#include <stdio.h>

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


static off_t flen(const char *file)
{
    struct stat st;
    if(stat(file,&st)<0 )
    {
        perror("stat()");
        exit(-1);
    }
    return st.st_size;
}

int main(int argc,char *argv[])
{
    if(argc <2)
        return -1;

    off_t len = flen(argv[1]);
    printf("%lld \n",(long long)len);

    return 0;
}

空洞文件

占用字节size大小,但是在linux下不占用磁盘空间,磁盘空间占用有:块大小*块总数。stat命令查看。

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc,char *argv[] )
{
    if(argc <2)
        return -1;

    int fd;
    fd = open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,0600);
    if(fd<0)
    {
        perror("open()");
        return -1;
    }
    // lseek(fd,5*1,SEEK_SET);
     lseek(fd,5LL*1024LL*1024LL*1024LL-1LL,SEEK_SET);//数字添加LL,防止计算过程中精度溢出
    write(fd,"",1);//发生一次系统调用,否则不占用空间
    close(fd);

    return 0;
}

文件访问权限

st_mode是一个16位的位图,用于表示文件的类型,文件访问权限及特殊的权限位,参考man手册:man 2  stat 

umask

使用命令:umask 可以设置 默认是 0002 
umask 0022

作用:防止产生权限过松的文件

文件权限管理

chmod

chmod命令更改文件的权限:chmod 777 temp.file 也可以使用 chmod a+x temp.file

chmod函数:int chmod(const char *pathname, mode_t mode); 

fchmod

fchmod函数:int fchmod(int fd, mode_t mode);

粘住位

粘住位又叫做T位。现在不太常用。 ll / 查看tmp目录下的文件

drwxrwxrwt  19 root root      4096 Jun  5 04:53 tmp/ (权限最后是t代表是t位)

文件系统

文件或数据的存储和管理。

FAT

FAT16/32本质是:静态存储的单链表(闭源,害怕大文件)

UFS

(开源,不怕大文件),缺陷:不善于管理小文件

面试题:给一个无符号的32位数,什么方法获取二进制有多少零,多少一?

算法-求二进制数中1的个数 - 翰墨小生 - 博客园 (cnblogs.com)

硬链接与符号连接

硬链接

ln /tmp/bigfile /tmp/bigfile_link  ln 源文件路径  目标文件路径

删除源文本不会影响硬链接文件

符号链接

ln -s /tmp/bigfile /tmp/bigfile_link  ln 源文件路径  目标文件路径

符号链接文件的size为文件名长度,块大小为0,删除源文件链接文件不可以。
函数:

        int link(const char *oldpath, const char *newpath); (链接)
        int unlink(const char *pathname);(删除,系统调用,不可移植)
        int remove(const char *pathname);(库函数-可移植)
       int rename(const char *oldpath, const char *newpath);(系统调用)

硬链接计数为0时会删除数据,否则硬链接技计数-1

硬链接与目录项是同义词,建立连接有限制:不能给分区建立,不能给目录建立。符号连接:可以跨分区,可以给目录建立。

utime

更改时间:最后一次读和写的时间。       

   struct utimbuf {
               time_t actime;       /* access time */
               time_t modtime;      /* modification time */
           };

int utime(const char *filename, const struct utimbuf *times);
 

目录的创建和销毁

mkdir       int mkdir(const char *pathname, mode_t mode);
rmdir       int rmdir(const char *pathname);

切换目录

       int chdir(const char *path);
       int fchdir(int fd);
        改变工作路径

chroot假根技术,安全机制。

       char *getcwd(char *buf, size_t size);

分析目录

glob

       #include <glob.h>

       int glob(const char *pattern, int flags,
                int (*errfunc) (const char *epath, int eerrno),
                glob_t *pglob);
       void globfree(glob_t *pglob);
 

#include <stdlib.h>
#include <stdio.h>
#include <glob.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>

#define PAT  "/etc/a*.conf"
#define PAT  "./" //不包括隐藏的文件

static int errfunc(const char*errpath,int eerrno)
{
    fprintf(stderr,"%s \n",errpath);
    fprintf(stderr,"errno = %s \n",strerror(eerrno));
    
    return 0;
}
int main(int argc,char*argv[])
{
     glob_t globres;

    int err = glob(PAT,0,errfunc,&globres);    
    if(err)
    {
        printf("err glob %d \n",err);
        exit(1);
    }
    for(int i=0;i<globres.gl_pathc;i++)
    {
        puts(globres.gl_pathv[i]);
    }
    globfree(&globres);

    return 0;
}

注意:glob第三个参数传递的是函数地址,函数中的名称一定要保持一致,否则会有警告。

opendir、closedir、readdir、rewinddir、seekdir、telldir

#include <stdlib.h>
#include <stdio.h>
#include <glob.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>

#define PAT "/etc"
#define PAT "./"

int main(int argc,char*argv[])
{

    DIR* dp;
    struct dirent*cur;

    dp = opendir(PAT);
    if(dp == NULL)
        exit(1);

    while(1)
    {
        cur = readdir(dp);
        if(cur ==NULL)
            break;
        puts(cur->d_name);

    }

    closedir(dp);

    return 0;
}

du命令

查看文件/目录所占空间大小,默认以K为单位。stat中一个Block大小单位为一块512B。

mydu

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <glob.h>

#define PATHSIZE 1024
static int path_noloop(const char*path)
{
    char*pos;
    pos = strrchr(path,'/');
    if(pos ==NULL)
    {
        exit(1);
    }
    if( strcmp(pos+1 ,".") ==0 || strcmp(pos+1,"..")==0   )
        return 0;
    return 1;

}
static int64_t mydu(const char*path)
{
    struct stat st;//可以加static进行优化
    char nextpath[PATHSIZE]; //可以加static进行优化
    glob_t res;
    int64_t  sum;
    
    if(lstat(path,&st)<0)//lstat解析连接文件
    {
        perror("lstat");
        exit(1);
    }
    if(!S_ISDIR(st.st_mode))
    {
    //非目录
        return st.st_blocks;
    }
    //目录
    int ret;
    strncpy(nextpath,path,PATHSIZE-1);
    strncat(nextpath,"/*",PATHSIZE-1); 
    ret = glob(nextpath,0,NULL,&res);

    strncpy(nextpath,path,PATHSIZE-1 );
    strncat(nextpath,"/.*",PATHSIZE-1);
    printf("nextpath = %s \n",nextpath);
    ret = glob(nextpath,GLOB_APPEND,NULL,&res);
    printf("glob =%d \n",ret);
    if(ret)//特殊要求指定为追加
    {
        perror("glob()");

        exit(1);
    }
    printf("res = %ld \n",res.gl_pathc);
    sum = 0;
    for(size_t i=0;i< res.gl_pathc;i++)
    {
        printf("res = %s \n",res.gl_pathv[i]);
        if(path_noloop(res.gl_pathv[i]) )
        {
            sum += mydu(res.gl_pathv[i]);
        }
    }
    sum+= st.st_blocks;
    return sum;
}

int main(int argc,char *argv[])
{
    if(argc <2)
    {
        fprintf(stderr,"Usage...\n");
        return -1;
    }
    int64_t ret;
    ret = mydu(argv[1]);

    printf("block %ld \n",ret/2);
    return 0;
}

二、系统数据文件和信息

/etc/passed

可以看到当前linux下,用户名和用户id对象关系。

        struct passwd *getpwnam(const char *name);

       struct passwd *getpwuid(uid_t uid);
      struct passwd {
               char   *pw_name;       /* username */
               char   *pw_passwd;     /* user password */
               uid_t   pw_uid;        /* user ID */
               gid_t   pw_gid;        /* group ID */
               char   *pw_gecos;      /* user information */
               char   *pw_dir;        /* home directory */
               char   *pw_shell;      /* shell program */
           };

#include <stdlib.h>
#include <stdio.h>

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

#include <pwd.h>

int main(int argc,char *argv[])
{
    
    if(argc <2)
    {
        return -1;
        printf("Usage...\n");
    }
    struct passwd*pw;

    pw = getpwuid(atoi(argv[1]) );
    
    puts(pw->pw_name);
    

    return 0;
}

/etc/group

可以看到当前linux下,用户组直接的关系。

         struct group *getgrnam(const char *name);

        struct group *getgrgid(gid_t gid);


           struct group {
               char   *gr_name;        /* group name */
               char   *gr_passwd;      /* group password */
               gid_t   gr_gid;         /* group ID */
               char  **gr_mem;         /* NULL-terminated array of pointers
                                          to names of group members */
           };

#include <stdlib.h>
#include <stdio.h>

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

#include <grp.h>

int main(int argc,char *argv[])
{
    
    if(argc <2)
    {
        return -1;
        printf("Usage...\n");
    }
    struct group*gr;

    gr = getgrgid(atoi(argv[1]) );
    
    puts(gr->gr_name);
    

    return 0;
}

/etc/shadow

一个很重要的文件,不可读,不可写,是属于密码的加密文件。

$1开头代表是MD5加密,    +盐(杂字串)
$2开头代表是Blowfish 加密
$5开头代表是SHA-256 加密
$6开头代表是SHA-512 加密
 


       struct spwd *getspnam(const char *name);

       struct spwd *getspent(void);

       void setspent(void);

       void endspent(void);

       struct spwd *fgetspent(FILE *stream);

       struct spwd *sgetspent(const char *s);

       int putspent(const struct spwd *p, FILE *stream);

       int lckpwdf(void);

       int ulckpwdf(void);
 

加密


     char *
     crypt(const char *phrase, const char *setting);

     char *
     crypt_r(const char *phrase, const char *setting, struct crypt_data *data);

     char *
     crypt_rn(const char *phrase, const char *setting, struct crypt_data *data, int size);

     char *
     crypt_ra(const char *phrase, const char *setting, void **data, int *size);
 

    去除回显

       char *getpass(const char *prompt);
 

#include <stdlib.h>
#include <stdio.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <shadow.h>
#include <crypt.h>
#include <string.h>

int main(int argc,char *argv[])
{
    char *pass;
    struct 	spwd* showline;
	if(argc <2)
    {
        printf("Usage...\n");
        return -1;
    }
    
    pass = getpass("PassWorld:");
	
    showline = getspnam(argv[1]);
    printf("pass = %s \n",pass ) ;


    char* cryped_pass = crypt(pass,showline->sp_pwdp); //加密
   printf("%s \n",cryped_pass);
   if( strcmp(showline->sp_pwdp,cryped_pass) ==0)
    {
        puts("OK");
    }
    else
        puts("Error");

    cryped_pass = crypt(pass,"$6$test$");
    printf("%s \n",cryped_pass);

    return 0;
}

由于 /etc/shadow 文件只能root查看,所以执行此代码需要用root用户,否则会有权限问题,会core.

时间戳

#include <stdlib.h>
#include <stdio.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <time.h>

void test(int flag)
{
    int a=10;
    time_t t = time(NULL);
    struct tm* tm;
    if(flag)
    {
        tm = localtime(&t);
    }
    printf("a = %p \n",&a);
    printf("t = %p \n",&t);
    printf("tm = %p \n",&tm);
    printf("tm = %d \n",tm->tm_year+1900);
    printf("=============================\n");

}
#define FILENAME "/tmp/out"

int main(int argc,char *argv[])
{
#if 0
	if(argc <2)
    {
        printf("Usage...\n");
        return -1;
    }
#endif

    FILE*fp=fopen(FILENAME,"a+");
    char buf[1024];
    int count;
    time_t stamp;
    struct tm* tm;
    while(1)
    {
        if( fgets(buf,sizeof(buf),fp) ==NULL)
            break;
        count++;
    }
    while(1)
    {
        time(&stamp);
        tm = localtime(&stamp);
        fprintf(fp,"%-4d%d-%d-%d %d:%d:%d\n",++count,tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,\
        tm->tm_hour,tm->tm_min,tm->tm_sec);
        fflush(fp);
        sleep(1);
    }
    fclose(fp);

    return 0;
}





#include <stdlib.h>
#include <stdio.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <time.h>

#define FILENAME "/tmp/out"

int main(int argc,char *argv[])
{
#if 0
	if(argc <2)
    {
        printf("Usage...\n");
        return -1;
    }
#endif

    time_t stamp = time(NULL);
    struct tm*tm = localtime(&stamp);
    char timestr[1024];
    strftime(timestr,1024,"Now:%Y-%m-%d ",tm);
    puts(timestr);

    tm->tm_mday +=100;

    strftime(timestr,1024,"test:%Y-%m-%d ",tm);
    puts(timestr);

    mktime(tm); //会自动进位
    
    strftime(timestr,1024,"100day:%Y-%m-%d ",tm);
    puts(timestr);
    

    return 0;
}

三、进程环境

进程的终止

正常终止

从main函数返回

调用exit

调用_exit或_Exit

最后一个线程从启动例程返回

最有一个线程调用了pthread_exit

异常终止

调用abort

接到一个信号并终止

最后一个进行对其取消请求做出响应

钩子函数atexit

#include <stdlib.h>
#include <stdio.h>

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

void f1()
{
    puts("f1() is working ");
}

void f2()
{
    puts("f2() is working ");
}

void f3()
{
    puts("f3() is working ");
}

int main(int argc,char *argv[])
{
    puts("Begin");

    atexit(f1);
    atexit(f2);
    atexit(f3);
    puts("end");
    return 0;
}

命令行参数的分析

getopt

#include <stdlib.h>
#include <stdio.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <time.h>

/*
    -y:year
    -m:month
    -d:day
    -H hour
    -M:minute
    -S:second

*/
int main(int argc,char *argv[])
{

    FILE*fp = stdout;
    time_t stamp = time(NULL);
    struct tm*tm = localtime(&stamp);
    char timestr[1024];
    int c;
    char fmtstr[32];
    fmtstr[0] = '\0';
    while(1)
    {
        c = getopt(argc,argv,"-H:MSy:md"); //加冒号可以进行修饰字符串,-识别分选项传参
        if(c<0)
            break;
        switch(c)
        {
            case 1:
                if(fp == stdout)
                {
                    fp = fopen(argv[optind-1],"w");
                    if(fp == NULL)
                    {
                        perror("fopen()");
                        fp = stdout;
                    }
                }
                break;
            case 'H':
                if(strcmp(optarg,"12")==0) //optarg是一个全局宏
                    strncat(fmtstr,"%I(%P) ",sizeof(fmtstr)-strlen(fmtstr)-1);
                else if(strcmp(optarg,"24")==0 )
                    strncat(fmtstr,"%H ",sizeof(fmtstr)-strlen(fmtstr)-1);
                else
                    fprintf(stderr,"Invaild argument");
                break;
            case 'M':
            {
                strncat(fmtstr,"%M ",sizeof(fmtstr)-strlen(fmtstr)-1);
                break;
            }
            case 'S':
                strncat(fmtstr,"%S ",sizeof(fmtstr)-strlen(fmtstr)-1);
                break;
            case 'y':
                if(strcmp(optarg,"2")== 0)
                    strncat(fmtstr,"%y ",sizeof(fmtstr)-strlen(fmtstr)-1);
                if(strcmp(optarg,"4")== 0)
                    strncat(fmtstr,"%Y ",sizeof(fmtstr)-strlen(fmtstr)-1);
    
                break;
            case 'm':
                strncat(fmtstr,"%m ",sizeof(fmtstr)-strlen(fmtstr)-1);
                break;
            case 'd':
                strncat(fmtstr,"%d ",sizeof(fmtstr)-strlen(fmtstr)-1);
                break;
            default:
                break;
        }
    }
    strncat(fmtstr,"\n",2);
   strftime(timestr,1024,fmtstr,tm);
   
   fputs(timestr,fp);

    if(fp != stdout)
        fclose(fp);

    return 0;
}


getopt_long

长格式,和上面用法一样。

环境变量

key=value,使用printenv、export可以查看。

#include <stdlib.h>
#include <stdio.h>

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

extern char** environ;

int main(int argc,char *argv[])
{
#if 0    
    for(int i=0;environ[i] !=NULL;i++)
    {
        puts(environ[i]);
    }
#endif 
    puts(getenv("USER"));
    setenv("USER","test",1);//0不覆盖  1覆盖
    
    puts(getenv("USER"));
   

    return 0;
}

C程序存储空间布局

64位程序内存空间分布128T,32位内存是4G

pmap命令可以查看。

动态库、静态库、手工装载库

       #include <dlfcn.h>

       void *dlopen(const char *filename, int flags);

       int dlclose(void *handle);

       #define _GNU_SOURCE
       #include <dlfcn.h>

       void *dlmopen (Lmid_t lmid, const char *filename, int flags);

       Link with -ldl.

       void *dlsym(void *handle, const char *symbol);
       char *dlerror(void);

函数跳转

   #include <setjmp.h>

       int setjmp(jmp_buf env); 设置跳转点
       int sigsetjmp(sigjmp_buf env, int savesigs);

       void longjmp(jmp_buf env, int val);跳转到指向位置
       void siglongjmp(sigjmp_buf env, int val);
 

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <setjmp.h>

jmp_buf save;

void c()
{

    printf("%s:Begin() \n",__FUNCTION__);
    printf("%s:Jump now! \n",__FUNCTION__);
    longjmp(save,6);

    printf("%s:End() \n",__FUNCTION__);
}

void b()
{

    printf("%s:Begin() \n",__FUNCTION__);

    printf("%s:Call c() \n",__FUNCTION__);
    c();
    printf("%s:c() return \n",__FUNCTION__);
    printf("%s:End() \n",__FUNCTION__);
}

void a()
{
    int ret;
    printf("%s:Begin() \n",__FUNCTION__);
    ret = setjmp(save);
    if(ret ==0)
    {
    
    printf("%s:Call b() \n",__FUNCTION__);
    b();
    printf("%s:b() return \n",__FUNCTION__);
    }
    else
    {
        printf("%s:Jumped back code = %d \n",__FUNCTION__,ret);
    }
    printf("%s:End() \n",__FUNCTION__);
}

int main(int argc,char *argv[])
{
    printf("%s:Begin() \n",__FUNCTION__);
    printf("%s:Call a() \n",__FUNCTION__);
    a();
    printf("%s:a() return \n",__FUNCTION__);

    printf("%s:End() \n",__FUNCTION__);

    return 0;
}

资源的获取及控制

命令:ulimit -a 

getrlimit():获取资源总量

setrlimit():设置资源总量

      #include <sys/time.h>
       #include <sys/resource.h>

       int getrlimit(int resource, struct rlimit *rlim);
       int setrlimit(int resource, const struct rlimit *rlim);

       int prlimit(pid_t pid, int resource, const struct rlimit *new_limit,
                   struct rlimit *old_limit);

       struct rlimit {
               rlim_t rlim_cur;  /* Soft limit */ 软限制
               rlim_t rlim_max;  /* Hard limit (ceiling for rlim_cur) */ 硬限制
           };
普通用户不能升级硬限制,root用户可以。软限制不能超过硬限制。

      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1828786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苹果加大AI布局,上海新店开业昭示中国市场新动向

随着全球科技巨头纷纷进军人工智能领域&#xff0c;苹果公司亦不甘示弱&#xff0c;近期在上海静安新店的开业以及CEO蒂姆库克的一系列动作&#xff0c;都显示出苹果在AI方面的雄心壮志。这不仅是对未来技术趋势的积极回应&#xff0c;更是对市场竞争态势的精准把握。 库克的访…

Gone框架介绍26 - Gone v1.x 版本 正式发布,更加强大的依赖注入,更加卓越的执行效率

gone是可以高效开发Web服务的Golang依赖注入框架 github地址&#xff1a;https://github.com/gone-io/gone 文档地址&#xff1a;https://goner.fun/zh/ 文章目录 优化和新特性gone 核心功能增强内置Goners覆盖测试 后续计划 优化和新特性 gone 核心功能增强 重构了函数参数依…

Qt项目天气预报(1) - ui界面搭建

ui中部 效果演示 ui效果 显示效果 控件列表 配合右图查看 居中对齐-label 设置label居中对齐(别傻傻的空格对齐了) 间距配置 widget03 外围的widget对象: 包含label 和 widget0301&#xff0c;如下图 widget0301 内围的widget对象&#xff0c;如下图 样式表 widget03 …

Java与数据库连接技术JDBC关键核心之PreparedStatement以及SQL注入演示解决和原理

PreparedStatement SQL注入 执行预编译的SQL对象 这样也能登录成功 模拟 SQL注入是这个原因 现在基本上不存在SQL注入的问题 解决 SQL注入就是传一些语句导致原来的SQL语句改变了 修改代码 通过设置参数的方式 就能防止SQL注入 实际上我们进行了一个转化 将字符和关键字进…

【归并排序】| 详解归并排序核心代码之合并两个有序数组 力扣88

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️专栏&#xff1a;动态规划 &#x1f397;️如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/merge-sorted-array/description/ 本道题是归并排序的…

Python学习打卡:day07

day7 笔记来源于&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了 目录 day753、列表的常用操作课后练习题54、列表的循环遍历列表的遍历—— while 循环列表的遍历—— for 循环while 循环和 for 循环的对比练习 55、元组…

回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限…

Kotlin 协程真的轻量吗?

前言 在官方文档的介绍中,提到了: 协程是轻量的 并给出了一个例子: fun main() = runBlocking {repeat(50_000) {// 启动大量的协程launch {delay

模型算法—线性回归

线性回归是统计学中最常见的一种回归分析方法&#xff0c;用于建立自变量&#xff08;解释变量&#xff09;和因变量&#xff08;响应变量&#xff09;之间的线性关系。线性回归模型可以用来预测一个或多个自变量对应的因变量的值。 线性回归的基本形式如下&#xff1a; &…

【麒麟虚拟机】NetworkManager没有运行

麒麟V10 建linux麒麟虚拟机&#xff0c;发现&#xff0c;网络没有配置 提示&#xff0c;NetworkManager没有运行。编辑联接也不能配置 解决方法&#xff0c;在终端输入命令&#xff1a; sudo systemctl start NetworkManager 启动以后&#xff0c;编辑连接选自动以太网&…

从 Linux 逻辑地址 线性地址 物理地址 内存管理设计,感受Linux kernel 设计的精妙

1&#xff0c;机器解析的思路 发现网络上大量的教程&#xff0c;多是以讹传讹地讲解 Linux 内存管理&#xff1b; 都是在讲&#xff1a; 逻辑地址 -> 线性地址 -> 物理地址 如果谙熟 Linux 制定的GPT和编译原理或对二进制分析比较熟练的话&#xff0c;会发现线性地…

[AIGC] Python的Range函数

Python的range()函数是一个内置函数&#xff0c;常常用于编程中生成数列。这个函数可以生成一个整数序列&#xff0c;这个序列通常用在循环中。 文章目录 基本用法详细用法注意事项 基本用法 range()函数的基本形式为 range(stop) —— 这将生成一个从0开始&#xff0c;到stop…

js 用正则表达式 匹配自定义字符之间的字符串数据,如:( )、[ ]、{ }、< >、【】等括号之间的字符串数据

要使用正则表达式匹配尖括号()之间的数据&#xff0c;可以使用以下代码示例&#xff1a; 在JavaScript中&#xff0c;你可以使用正则表达式来匹配括号()之间的数据。以下是一个简单的例子&#xff0c;它展示了如何使用正则表达式来获取两对括号之间的文本。 // 示例字符串 con…

5.3.1_2 二叉树的层次遍历

&#x1f44b; Hi, I’m Beast Cheng&#x1f440; I’m interested in photography, hiking, landscape…&#x1f331; I’m currently learning python, javascript, kotlin…&#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…

17个关键方法指南,保护您的web站点安全!

了解如何让您的web应用程序或网站安全&#xff0c;对于网站所有者来说至关重要。以下是一些关键步骤&#xff0c;可以帮助您保护网站免受攻击和数据泄露。 1.使用公钥加密技术 当数据以明文形式传输时&#xff0c;它容易受到中间人 &#xff08;MitM&#xff09; 攻击。这意味…

System-Verilog 实现DE2-115流水灯

文章目录 一、 SystemVerilog1. SystemVerilog简介2. 基本语法和特性 二、实验过程hello.v文件引脚分配 三、实验效果参考 一、 SystemVerilog 1. SystemVerilog简介 SystemVerilog是一种高级的硬件描述语言&#xff08;HDL&#xff09;&#xff0c;它不仅继承了Verilog语言的…

SpringBoot实现的大文件上传

前言 大文件分片上传和断点续传是为了解决在网络传输过程中可能遇到的问题&#xff0c;以提高文件传输的效率和稳定性。 首先&#xff0c;大文件分片上传是将大文件分割成较小的片段进行上传。这样做的好处是可以减少单个文件的传输时间&#xff0c;因为较小的文件片段更容易快…

vcomp140.dll丢失原因与vcomp140.dll,无法继续执行代码的修复办法详解

vcomp140.dll 是一个动态链接库&#xff08;Dynamic Link Library&#xff0c;DLL&#xff09;文件&#xff0c;它在 Windows 操作系统中扮演着关键角色。该文件通常位于系统的标准目录 C:\Windows\System32 下&#xff0c;由微软公司开发并随特定版本的 Windows 或相关软件包一…

kubeadm快速部署K8S

目录 一、kubeadm安装K8S 1.1 环境准备 1.2 初始化配置 1.3 所有节点安装docker 1.3.1 安装依赖环境和docker 1.3.2 定义docker 配置文件 1.3.3 重启并开机自启docker 1.3.4 查看docker 是否配置成功 1.4 master、node01 、node02安装kubeadm&#xff0c;kubelet和kub…

CSS 实现个人资料卡

CSS 实现个人资料卡 效果展示 CSS 知识点 CSS 综合知识运用 页面整体布局 <div class"card"><div class"imgBox"><img src"./bg.jpg" /></div><div class"content"><div class"details&quo…