Linux环境

news2024/9/29 11:35:20

Linux环境

  • 导语
  • 程序参数
    • getopt
    • getopt_long
  • 环境变量
    • getenv/putenv
    • environ
  • 时间和日期
    • time
    • difftime和gmtime
    • ctime&asctime
    • strftime/strptime
  • 临时文件
    • tmpnam
    • tmpfile
  • 获取信息
    • 用户
    • 主机
    • 日志
  • 资源和限制
  • 总结
  • 参考文献

导语

任何程序都是在一定的环境下运行的,通常这些环境除了有路径之外,还有权限、外部变量、系统变量等,这些都可以在程序中被调用

程序参数

在Linux中运行C语言程序时,程序是从main函数开始运行的,main函数有两个参数,参数个数和参数数组。一般来说是用shell来启动一个C程序,这个时候就可以通过给shell追加参数来实现参数对C语言的输入,需要注意的是程序名本身是参数0

除此之外,在使用命令行时还需要遵守一定的书写规范,所有命令行开关应以一个短横线开头,然后跟着单个字母或数字,不带后续参数的选项可以归并,如果某选项需要值,则该值应作为独立参数紧跟选项

getopt

getopt函数原型如下

int getopt(int argc, char *const argv[], const char *optstring);

参数分别为main的argc和argv,optstring是字符列表,每个字符代表一个单字符选项,如果字符紧跟冒号,则代表该选项有值,下一个在参数就是其值

与getopt密切相关的还有外部变量optarg、optind、opterr、optopt

getopt的返回值是argv数组的下一个选项字符,可以认为通过getopt对选项进行单次遍历,遍历的具体情况如下

在这里插入图片描述

getopt通过optind来记录已经访问的记录,opterr用来判断是否需要向stderr输出,下面是书上的一个例子和运行结果

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

int main(int argc, char *argv[])
{
    int opt;
    while((opt=getopt(argc,argv,":if:lr"))!=-1)
    {
        switch(opt)
        {
        case 'i':
        case 'l':
        case 'r':
            printf("option: %c\n",opt);
            break;
        case 'f':
            printf("filename: %s\n",optarg);
            break;
        case ':':
            printf("option need a value\n");
            break;
        case '?':
            printf("unknown option: %c\n",optopt);
            break;
        }
    }
    for(; optind<argc; optind++)
        printf("argument: %s\n",argv[optind]);
    return 0;
}

在这里插入图片描述

可以看到所有参数都被切割开来并分别处理

getopt_long

getopt_long的函数比getopt多几个参数,函数原型如下

int getopt_long(int argc, char * const argv[],  const char *optstring,  const struct option *longopts, int *longindex, int flags);

longopts是一个指向 option 结构数组的指针,用于描述长选项。每个 option 结构包含长选项的名称、是否有附加参数、选项的简短描述(用于错误消息)以及一个标志,指示该选项是否被找到

longindex:如果非 NULL,则指向一个变量,该变量将设置为找到的长选项在 longopts 数组中的索引

flags:控制 getopt_long 行为的标志。最常用的标志是 no_argument(0)、required_argument(1)和 optional_argument(2),它们用于指定长选项是否需要附加参数

option中变量的定义如下

在这里插入图片描述

环境变量

环境变量可以用来控制shell脚本和程序行为,每个用户都有一个自己的环境变量,用来标注用户的工作目录,环境的格式为“名字=值”,一般来说可以通过getenv和putenv来对环境变量进行修改

getenv/putenv

getenv和putenv的函数原型如下

char *getenv(const char *name)
int putenv(cons char *string)

书上给出的例子和运行结果如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char * argv[])
{
    char *var,*value;
    if(argc==1||argc>3)//判断错误
    {
        fprintf(stderr,"usage: environ var [value]\n");
        exit(1);
    }
    var =argv[1];//拿要找的环境名称
    value=getenv(var);//拿到具体环境值
    if(value)
        printf("Variable %s has value %s\n",var,value);
    else
        printf("Variable %s has no value\n",var);
    if(argc==3)//如果是赋值
    {
        char *string;
        value=argv[2];
        string=malloc(strlen(var)+strlen(value)+2);
        if(!string)
        {
            fprintf(stderr,"out of memory\n");
            exit(1);
        }
        strcpy(string,var);
        strcat(string,"=");
        strcat(string,value);
        printf("putenv: %s\n",string);
        if(putenv(string)!=0)
        {
            fprintf(stderr,"putenv failed\n");
            free(string);
            exit(1);
        }
        value =getenv(var);
        if(value)
            printf("New value of %s is %s\n",var,value);
        else
            printf("New value of %s is null\n",var);
        exit(0);
    }
    return 0;
}

在这里插入图片描述

可以看到对环境的修改作用域仅限程序,这是因为变量的值不会从子进程(运行程序)传到父进程(shell)

environ

程序的环境实际上是一个字符数组,程序可以通过environ变量直接访问数组,书上给出的例子和结果如下,可以看到,这个程序遍历的所有的环境变量,并将他们输出

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern char **environ;
int main(int argc,char * argv[])
{
    char **env=environ;
    while(*env)
    {
        printf("%s\n",*env);
        env++;
    }
    return 0;
}

在这里插入图片描述

时间和日期

时间通过一个预定义的time_t来处理,它是一个长整型,所有UNIX系统都以1970.1.1.0为起点

time

可以通过调用time函数得到底层的值,函数原型如下

time_t time(time_t *tloc);//返回值写入tloc

书上给出的一个简单的例子和运行结果如下,每10s打印一次底层时间值

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

int main()
{
    int x;
    time_t tm;

    for (int i=1;i<=5;i++)
    {
        tm=time(0);
        printf("The time is %ld\n",tm);
        sleep(1);
    }
    return 0;
}

在这里插入图片描述

difftime和gmtime

difftime用来计算两个time_t值之间的秒数并返回,函数原型如下

double difftime(time_t time1, time_t time2);
//计算时间差并将差值作为浮点数返回

Linux在进行底层运算时,通常是使用绝对的秒数,但是绝对的秒数通常很大,并不方便阅读,因此需要将时间转换成用户容易理解的形式,gtime函数就是用来实现这个功能的

gtime的函数如下

sturct tm *gmtime(const time_t *timeval);

struct tm的定义如下

在这里插入图片描述

下面是书上给出的一个简单的例子以及运行结果

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <pwd.h>
#include <syslog.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <math.h>
#include <time.h>
int main()
{
    struct tm *tm_ptr;
    time_t ttm;

    (void)time(&ttm);
    tm_ptr=gmtime(&ttm);//获得绝对秒数并将结果作为tm返回

    printf("second:%ld\n",ttm);
    printf("gmtime: date:%02d/%02d/%02d\n",tm_ptr->tm_year,tm_ptr->tm_mon+1,tm_ptr->tm_mday);//访问tm的信息
    printf("time: %02d:%02d:%02d\n",tm_ptr->tm_hour,tm_ptr->tm_min,tm_ptr->tm_sec);//同上
    return 0;
}

在这里插入图片描述

还有一些别的方便显示的函数,例如当所处时区不在GMT或者使用夏令时,显示的时间可能就不对,这个时候可以用localtime、mktime等函数实现符合时区的正确的显示

ctime&asctime

为了获得更好的显示,可以使用ctime和asctime,两者的函数原型如下

char *asctime(const struct tm *timeptr);
char *ctime(const time_t *timeval);

两者的参数不同,一个是tm格式,另一个是time_t格式,但是返回的都是一个特定格式的时间字符串,书上给出的例子和运行结果如下

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <pwd.h>
#include <syslog.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <math.h>
#include <time.h>
int main()
{
    time_t v;

    (void)time(&v);//给时间赋值
    printf("The date is: %s\n", ctime(&v));//按照指定格式输出
    return 0;
}

在这里插入图片描述

strftime/strptime

为了方便实现对时间的格式有更多的控制,Linux还包含了strftime和strptime两个函数,函数原型如下

size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr);
//存储目标,长度,格式串,时间变量来源
char *strptime(const char *buf, const char *format, struct tm *timeptr);
//存储目标,格式串,时间变量来源

它们有点类似一个针对时间的sprintf函数,第一个参数都是存储的目标,最后一个都是来源,中间都存在一个规定格式串,转换符较多,这里不展示,以下是书上的一个例子和执行的结果

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <pwd.h>
#include <syslog.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <math.h>
#include <time.h>
int main()
{
    struct tm *tm_ptr, timestruct;
    time_t ttime;
    char buf[256],*result;

    (void)time(&ttime);//获得时间
    tm_ptr=localtime(&ttime);//转成符合当地的时间格式
    strftime(buf,256,"%A %d %B, %I:%M %p",tm_ptr);//把时间格式写入buf
    printf("strftime gives: %s\n",buf);
    strcpy(buf,"Mon 12 June 2003, 12:33 will do fine");//赋值

    printf("calling strptime with: %s\n", buf);
    tm_ptr=&timestruct;

    result=strptime(buf,"%a %d %b %Y, %R",tm_ptr);
    printf("strptime consumed up to: %s\n",result );

    printf("strptime gives:\n");
    printf("date: %02d/%02d/%02d\n",tm_ptr->tm_year%100,tm_ptr->tm_mon+1);
    return 0;
}

在这里插入图片描述

调用time和localtime得到当前本地时间,然后使用合适的format转换时间,之后将转换完的时间串进行输出

临时文件

程序在运行的时候经常产生临时文件,这些临时文件可能保存中间结果,或者是备份,临时文件的用法很常见,但是有一个隐藏的缺点,就是临时文件时在使用的时候是唯一的,即程序和文件之间是一一对应的关系,如果没有这样的对应关系,因为Linux允许文件重名,就可能导致程序相互干扰

tmpnam

tmpnam可以生成一个唯一的文件名,函数原型如下

char *tmpnam(char *s);
//返回一个不与任何文件同名的文件名,即使s不空也会被刷新

tmpnam的后续调用会覆盖返回值的静态存储区,如果多次调用必须传入字符串参数,每次调用都会返回不一样的文件名。

tmpfile

如果临时文件需要立刻使用,可以使用tmpfile在命名的同时打开,以避免另一个程序创建出一个与tmpnam返回的文件名同名的文件,函数原型如下

FILE *tmpfile(void)
//创建一个文件流指针,指向一个唯一的临时文件,rw,文件的所有引用关闭则自动删除,出错则返回NULL,设置errno

书上给出的例子和运行结果如下

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <pwd.h>
#include <syslog.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <math.h>
#include <time.h>
int main()
{
    char tmpname[L_tmpnam],*filename;
    FILE *tmpfp;
    filename=tmpnam(tmpname);//创一个临时文件名

    printf("Temporary file name is: %s\n",filename);
    tmpfp=tmpfile();//也是创一个临时文件,但是是流的方式
    if(tmpfp)
        printf("Opened a temporary file OK\n");
    else
        perror("tmpfile");
    return 0;
}

在这里插入图片描述

程序为临时文件生成一个唯一的文件名,tmpfile调用同时创建和打开一个临时文件,需要注意的是在使用的时候会弹出警告,这也提醒我们之后最好使用mkstemp而不是tmpnam

Linux还有其他的生成临时文件名的方式,mktemp和mkstemp,用法和tmpnam类似,具体不再赘述,尽量使用tmpfile和mkstemp而不是tmpnam和mktemp

获取信息

用户

用户有一个唯一用户标识符UID,每个程序也会与对应的UID相关联,UID有其自己的类型uid_t,通常为一个小整数,可以通过一些基本的函数来获得,如getuid、getlogin、getpwuid、getpwnam等,以下是函数原型

uid_t getuid(void);//返回程序关联的uid
char *getlogin(void);//与当前用户关联的用户名
struct passwd *getpwuid(uid_t uid);//拿密码
struct passwd *getpwnam(const char *name);//同上

这里给出struct passwd的成员

在这里插入图片描述

下面是书上给出的一个例子和运行结果

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <pwd.h>
int main()
{
    uid_t uid;
    gid_t gid;
    struct passwd*pw;
    uid=getuid();
    gid=getgid();
    printf("User is %s \n",getlogin());
    printf("User IDs: uid=%d, gid=%d",uid, gid);
    pw=getpwuid(uid);
    printf("UID passwd entry :\n name=%s, uid=%d, gid=%d, home=%s, shell=%s\n",pw->pw_name,pw->pw_uid,
    pw->pw_gid,pw->pw_dir,pw->pw_shell);
    return 0;
}

在这里插入图片描述

在这里插入图片描述

可以看到该程序访问到了用户涉及到的信息,管理员权限的信息需要加上sudo

除了这几个之外还有一些别的函数,例如getwent、geteuid等

主机

与用户信息一样,主机的信息也同样可以获得,如果系统安装了网安组件,可以通过gethostname获取其网络名

int gethostname(char *name, size_t namelen)//把机器的网络名写入name

还可以通过uname获得更多详细信息

int uname(struct utsname *name);

struct utsname的成员如下

在这里插入图片描述

下面是书上给出的一个示例程序和运行结果

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <pwd.h>
int main()
{
    char computer[256];
    struct utsname uts;
    if(gethostname(computer,255)!=0||uname(&uts)<0)
    {
        fprintf(stderr,"error\n");
        exit(1);
    }
    printf("Computer host name is %s\n",computer);
    printf("System is %s on %s hardware\n",uts.sysname,uts.machine);
    printf("Nodename is %s\n",uts.nodename);
    printf("Version is %s, %s\n",uts.release,uts.version);
    return 0;
}

在这里插入图片描述

可以看到主机的网络名、硬件名和系统信息都输出了,除此之外,还可以通过gethostid获得主机的唯一标识符

日志

日志通常用来记录各种应用程序的活动记录,包括一系列的错误和警告信息,一般来说,日志文件都存储在/usr/adm或/var/log中,系统为产生日志信息提供了一个接口

void syslog(int priority, const char *message, arguments...);
//向系统日志发送一条消息,每条消息有一个priority参数,该参数是一个严重级别与一个设施值的按位或,
//严重级别不同,系统对信息采取的措施就不痛

还有一些其他的能够改变日志记录的函数,如closelog、openlog、selogmask等

资源和限制

Linux的程序在运行的时候需要各种各样的资源,包括硬件资源,使用时间限制等,OS方面的显示常量在limits.h当中,除此之外,还有对资源操作的函数,如程序长度、执行优先级等,具体的函数原型如下

int getpriority(int which, id_t who);
//which是要查询的优先级类型如进程或进程组,who是要查询的ID,id_t是整数类型,用于标识用户和组标识符
int setpriority(int which, id_t who, int priority);
int getrlimit(int resource, struct rlimit *r_limit);
//resource:指定要查询的资源类型,如RLIMIT_CPU(CPU时间限制)、RLIMIT_FSIZE(文件大小限制)等。
//r_limit:指向rlimit结构的指针,用于存储查询到的资源限制信息
int setrlimit(int resource, const struct rlimit *r_limit);
int getrusage(int who, struct rusage *r_usage);
//who:指定要查询的对象,常见值有RUSAGE_SELF(查询当前进程)、RUSAGE_CHILDREN(查询当前进程的子进程)等。
//r_usage:指向rusage结构的指针,用于存储查询到的资源使用情况

下面是给出的一个例子和运行的结果

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <pwd.h>
#include <syslog.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <math.h>
void work()
{
    FILE *f;
    double x=4.5;
    f=tmpfile();//创建临时文件
    for(int i=0; i<10000; i++)
    {
        fprintf(f,"Output\n");//输出到临时文件
        if(ferror(f))//如果超过长度
        {
            fprintf(stderr,"error memory");
            exit(1);
        }
    }
    for(int i=0; i<1000000; i++)
        x++;
}
int main()
{
    struct rusage r_usage;//确定程序耗费的时间,使用的用户时间和系统时间
    struct rlimit r_limit;//设置程序运行的限制
    int priority;
    work();
    getrusage(RUSAGE_SELF,&r_usage);//返回程序的使用信息
    printf("CPU usage: User = %ld.%06ld, System = %ld.%06ld\n",r_usage.ru_utime.tv_sec, r_usage.ru_utime.tv_usec
           ,r_usage.ru_stime.tv_sec,r_usage.ru_stime.tv_usec);
    priority=getpriority(PRIO_PROCESS,getpid());//获得优先级
    printf("Current priority = %d\n",priority);

    getrlimit(RLIMIT_FSIZE,&r_limit);//获得限制信息
    printf("Current FSIZE limit: soft = %ld, hard = %ld\n",r_limit.rlim_cur,r_limit.rlim_max);

    r_limit.rlim_cur=2048;//设置限制
    r_limit.rlim_max=4096;
    printf("Setting a 2K file size limit\n");
    setrlimit(RLIMIT_FSIZE,&r_limit);
    work();
    return 0;
}

在这里插入图片描述

在这里插入图片描述

运行程序可以看到消耗的资源以及程序运行的优先级,当设置了文件大小限制的时候,程序就不能往临时文件写入多余2MB了,当使用nice启动程序来改变程序的优先级,程序的执行时间变长了,可以看到第一次work的时候由于没有设置文件大小,因此可以顺利的运行程序,但是当设置了文件大小之后,work便无法运行了

总结

本章介绍了Linux环境相关的内容,主要是一些系统设置好的函数和结构体以及它们的使用,例如时间、信息、系统运行等

参考文献

  1. 《Linux程序设计(第4版)》

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

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

相关文章

分布式事务学习笔记(二)Seata架构、TC服务器部署、微服务集成Seata

文章目录 前言2 Seata2.1 Seata的架构2.2 部署TC服务1&#xff09;下载安装包2&#xff09;解压3&#xff09;修改配置文件4&#xff09;在Nacos中添加TC服务配置5&#xff09;创建数据库表6&#xff09;启动TC服务7&#xff09;查看TC服务 2.3 微服务集成Seata2.3.1 引入依赖2…

通过覆写 url_for 将 flask 应用部署到子目录下

0. 缘起 最近用 flask 写了一个 web 应用&#xff0c;需要部署到服务器上。而服务器主域名已经被使用了&#xff0c;只能给主域名加个子目录进行部署&#xff0c;比如主域名 example.org &#xff0c;我需要在 example.org/flask 下部署。这时 flask 应用里的内部连接们就出现…

sqli-labs Basic Challenge Less_1 通关指南

sqli-labs Basic Challenge Less_1 通关指南 测试注入点测试注入点的数据类型测试过程&#xff1a; 测试返回点&#xff1a;测试列数&#xff1a;测试返回点&#xff1a; 收集数据&#xff1a;版本用户权限库名表名与列名 查找敏感信息 测试注入点 在进行SQL注入之前&#xff…

React js Router 路由 2, (把写过的几个 app 组合起来)

完整的项目&#xff0c;我已经上传了&#xff0c;资源链接. 起因&#xff0c; 目的: 每次都是新建一个 react 项目&#xff0c;有点繁琐。 刚刚学了路由&#xff0c;不如写一个 大一点的 app &#xff0c;把前面写过的几个 app, 都包含进去。 这部分感觉就像是&#xff0c; …

打包部署若依(RuoYi)SpringBoot后端和Vue前端图文教程

打包后端‘ 1&#xff0c;打开若依&#xff0c;点击右侧的Maven展开Maven管理&#xff0c;选择ruoyi>Lifecycle 先双击clean清除原本启动项目时生成的文件。然后点击package等待项目打包&#xff0c;切记要取消运行再打包 打包完成后会在ruoyi-admin>src>target里面…

Qt 边框border - qss样式

border属性 实际上&#xff0c;border并不是一个单独的属性&#xff0c;在Qt样式表中&#xff0c;它通常指的是一系列与边框相关的属性的组合。然而&#xff0c;你也可以在一条样式规则中一次性设置所有这些值&#xff0c;如下所示&#xff1a; QPushButton { border: 2px sol…

HTB-Unified(log4j2漏洞、MongoDb替换管理员密码)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解Unified靶机 渗透过程 信息搜集 服务器开放了SSH服务&#xff0c;HTTP服务 访问网站 验证log4j2漏洞 8443端口&#xff1a;UniFi 网络 &#xff0c;访问查询 是否有Nday漏洞利用 可以观察到UniFi的版…

汇编实现从1加到1000(《X86汇编语言 从实模式到保护模式(第2版》) 第135页第2题解答)

题目: 编写一段主引导扇区程序,计算从1加到1000的和,并在屏幕上显示结果 输出结果: 代码: jmp near start text db 123...1000 start:mov ax,0x07c0mov ds,ax ;数据段从主引导区开始mov ax,0xb800mov es,ax ;显存地址从B8000物理地址开始mov si,text ;si指向text的第…

linux系统安装miniconda3

一、下载minconda3 下载地址&#xff1a;https://docs.conda.io/en/latest/miniconda.html 一般国内访问比较困难&#xff0c;可到清华软件镜像站 Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 需要特别注意自己的下载版本和自己的…

苹果CMS海洋CMS那个更容易被百度收录?苹果CMS站群

SEO优化和搜索引擎的友好性常常是网站管理员关注的重点。苹果CMS&#xff08;maccmscn&#xff09;和海洋CMS都是国内常见的CMS平台&#xff0c;但在搜索引擎优化&#xff08;SEO&#xff09;和百度收录方面&#xff0c;苹果CMS凭借其优秀的插件生态系统&#xff0c;特别是泛目…

Java 类一口气给你讲完!(✿◡‿◡)

Java 类实例 Java面向对象设计 - Java类实例 以下是创建类的实例的一般语法: new <Class Constructor>;new 运算符后面是对构造函数的调用。 new 运算符通过分配堆上的内存来创建类的实例。以下语句创建Dog类的实例: new Dog();Dog()是对Dog类的构造函数的调用。 当…

PTT:Point Tree Transformer for Point Cloud Registration 论文解读

目录 一、导言 二、相关工作 1、基于Transformer的点云配准 2、针对点云的局部注意力 三、PTT 1、KPconv提取特征 2、Tree Transformer Encoder 3、Decoder 4、估计姿态 5、损失函数 四、实验 1、对比不同Backbone 2、运行时间对比 3、对比不同PTT方法下RR指标的…

[机器学习]决策树

1 决策树简介 2 信息熵 3 ID3决策树 3.1 决策树构建流程 3.2 决策树案例 4 C4.5决策树 5 CART决策树&#xff08;分类&回归&#xff09; 6 泰坦尼克号生存预测案例 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.tree import …

starUML使用说明文档[简单易懂/清晰明了]||好上手

1. 安装 StarUML 首先&#xff0c;您需要从 StarUML 官方网站&#xff08;http://staruml.io/&#xff09;下载最新版本的 StarUML 安装包。然后&#xff0c;按照提示进行安装。&#xff08;联想可以从软件管家里下载&#xff09; 2. 打开 StarUML 安装完成后&#xff0c;双击桌…

mac上Charles怎么配置,可以抓取浏览器/IDEA的接口

一、抓取浏览器接口 1、下载安装Charles后&#xff0c;按下图操作安装证书&#xff0c;mac撒好难过要把证书调整为可信任 2、打开macOS代理 方式一&#xff1a;指点开启这里 方式二&#xff1a;进入代理配置中开启&#xff0c;结果和方式一一样的 3、这时就可以抓取到浏览器…

高职院校人工智能技术和无人机技术实训室建设方案

一、方案背景与需求分析 1.1 人工智能与无人机技术发展概况 人工智能&#xff08;AI&#xff09;和无人机技术作为当今科技领域的两大热点&#xff0c;正以前所未有的速度发展和渗透到各行各业中。根据国际数据公司(IDC)的报告&#xff0c;全球人工智能市场规模预计将在2024年…

Oracle按照某一字段值排序并显示,相同的显示序号

Oracle按照某一字段值排序并显示,相同的显示序号 最近的工作遇到对于相同的字段,按照序号去显示值,并对相同的值进行排序 实验了半天,感觉满意的答案,分享给大家 第一种: ROW_NUMBER 语法: ROW_NUMBER() OVER (ORDER BY your_column) AS sequence_number 说明: 根据your_column…

Python 数学建模——ARMA 时间序列分析

文章目录 前言使用前提平稳性检验白噪声检验 用法代码实例第一步——平稳性分析方法一方法二方法三 第二步——白噪声分析第三步——确定参数第四步——模型构建与检验检验模型效果预测未来数据 前言 常见的时间序列分析方法有很多&#xff0c;之前介绍了一个稍微新颖的 Prophe…

55 mysql 的登录认证流程

前言 这里我们来看一下 mysql 的认证的流程 我们这里仅仅看 我们最常见的一个 认证的处理流程 我们经常会登录的时候 碰到各种异常信息 认证失败的大体流程 大概的流程是这样 客户端和服务器建立连接之后, 服务器向客户端发送 salt 然后 客户端根据 salt 将客户端传入的…

MySQL权限控制(DCL)

我的mysql里面的一些数据库和一些表 基本语法 1.查询权限 show grants for 用户名主机名;例子1&#xff1a;查询权限 show grants for heima%;2.授予权限 grant 权限列表 on 数据库名.表名 to 用户名主机名;例子2&#xff1a; 授予权限 grant all on itcast.* to heima%;…