IO进程线程day4(2023.8.1)

news2024/7/6 19:00:39

一、Xmind整理:

进程的五态图:

 内存分布图:

 注:栈区:存储局部变量,形参(上边打错了!!!)

虚拟内存和物理内存:

进程的STAT:

二、课上练习:

练习1:将课上的文件权限提取修改成循环方式

#include <stdio.h>
#include <head.h>

void get_filePermission(mode_t m)
{
	//方法一:
	/*
	   for(int i=0;i<9;i++)
	   {
	   if((m&(0400>>i))==0)
	   {
	   putchar('-');
	   continue;
	   }
	//能运行到当前位置,则代表对应位置有权限
	//需要判断是r  w  x当中的哪一个
	switch(i%3)
	{
	case 0:putchar('r');break;
	case 1:putchar('w');break;
	case 2:putchar('x');break;
	}
	}
	*/

	//方法二:
	char buf[]="rwx";
	for(int i=0;i<9;i++)
	{
		if((m&(0400>>i))==0)
		{
			putchar('-');
			continue;
		}
		printf("%c",buf[i%3]);
	}
	return;
}
int main(int argc, const char *argv[])
{
	struct stat buf;
	if(stat("./2.png", &buf) < 0)
	{
		ERR_MSG("stat");
		return -1;
	}

	//文件的类型和权限
	printf("mode: 0%o\n", buf.st_mode);
	get_filePermission(buf.st_mode);

	//文件的硬链接数
	printf("link: %ld\n", buf.st_nlink);

	//文件的所属用户
	printf("uid: %d\n", buf.st_uid);

	//文件所属组用户
	printf("gid: %d\n", buf.st_gid);

	//文件大小
	printf("size: %ld\n", buf.st_size);

	//文件的修改时间
	printf("time: %ld\n", buf.st_ctime);

	return 0;
}

练习2:提取文件的类型

mode_t    st_mode   本质上是一个unsigned int类型,里面存储了文件的类型和权限。

方法1: 

man 2 stat --> st_mode --->see inode(7)
man 7 inode -->

           S_ISREG(m)  is it a regular file?                         -

           S_ISDIR(m)  directory?                                    d

           S_ISCHR(m)  character device?                             c

           S_ISBLK(m)  block device?                                 b

           S_ISFIFO(m) FIFO (named pipe)?                            p

           S_ISLNK(m)  symbolic link?  (Not in POSIX.1-1996.)        l

           S_ISSOCK(m) socket?  (Not in POSIX.1-1996.)               s

若是该类型文件,则返回真,否则返回假
void get_fileType(mode_t m) 
{
    if(S_ISREG(m))
        putchar('-');

    else if(S_ISDIR(m))
        putchar('d');

    else if(S_ISCHR(m))
        putchar('c');       

    return ;

}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <head.h>
void get_fileType(mode_t m)
{
	if(S_ISREG(m))
		putchar('-');
	else if(S_ISDIR(m))
		putchar('d');
	else if(S_ISCHR(m))
		putchar('c');
	else if(S_ISBLK(m))
		putchar('b');
	else if(S_ISFIFO(m))
		putchar('p');
	else if(S_ISLNK(m))
		putchar('l');
	else if(S_ISSOCK(m))
		putchar('s');

	return;
}
int main(int argc, const char *argv[])
{
	struct stat buf;
	if(stat("./2.png", &buf) < 0)
	{
		ERR_MSG("stat");
		return -1;
	}

	//文件的类型和权限
	printf("mode: 0%o\n", buf.st_mode);
	get_fileType(buf.st_mode);   
	//文件的硬链接数
	printf("link: %ld\n", buf.st_nlink);

	//文件的所属用户
	printf("uid: %d\n", buf.st_uid);

	//文件所属组用户
	printf("gid: %d\n", buf.st_gid);

	//文件大小
	printf("size: %ld\n", buf.st_size);

	//文件的修改时间
	printf("time: %ld\n", buf.st_ctime);

	return 0;
}

方法2: 

mode       0040775
S_IFMT     0170000   bit mask for the file type bit field

mode       0040775 ---> 000 100 000 111 111 101
S_IFMT     0170000 ---> 001 111 000 000 000 000  &
                    ------------------------------
                        000 100 000 000 000 000 ---> 040000

与下列宏进行比较,与哪个相同,就是对应类型文件
           S_IFSOCK   0140000   socket
           S_IFLNK    0120000   symbolic link
           S_IFREG    0100000   regular file
           S_IFBLK    0060000   block device
           S_IFDIR    0040000   directory
           S_IFCHR    0020000   character device
           S_IFIFO    0010000   FIFO

mode:      0100664 ---> 001 000 000 110 110 100
S_IFMT     0170000 ---> 001 111 000 000 000 000  &
                    ------------------------------
                        001 000 000 000 000 000 ---> 0100000
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <head.h>
#include <time.h>
void get_fileType(mode_t m)
{
	switch(m&S_IFMT)
	{
	case S_IFSOCK:putchar('s');break;
	case S_IFLNK:putchar('l');break;
	case S_IFREG:putchar('-');break;
	case S_IFDIR:putchar('d');break;
	case S_IFCHR:putchar('c');break;
	case S_IFBLK:putchar('b');break;
	case S_IFIFO:putchar('p');break;
	}
	return;
}
int main(int argc, const char *argv[])
{
	struct stat buf;
	if(stat("./2.png", &buf) < 0)
	{
		ERR_MSG("stat");
		return -1;
	}

	//文件的类型和权限
	printf("0%o ", buf.st_mode);
	get_fileType(buf.st_mode);   
	//文件的硬链接数
	printf("%ld ", buf.st_nlink);

	//文件的所属用户
	printf("%d ", buf.st_uid);
	struct passwd* pwd=getpwuid(buf.st_uid);
	if(NULL==pwd)
	{
		ERR_MSG("getpwuid");
		return -1;
	}
	printf("%s ",pwd->pw_name);

	//文件所属组用户
	printf("%d ", buf.st_gid);
	struct group* grp=getgrgid(buf.st_gid);
	if(NULL==grp)
	{
		ERR_MSG("getgrgid");
		return -1;
	}
	printf("%s ",grp->gr_name);

	//文件大小
	printf("%ld ", buf.st_size);
	//文件的修改时间
	struct tm* info=NULL;
	info=localtime(&buf.st_mtime);
	//printf("%ld ",buf.st_ctime);
	printf("%02d %02d %02d:%02d ",info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min);
	printf("2.png\n");

	return 0;
}

练习3:提取文件所属用户名

uid_t     st_uid;         /* User ID of owner */     用户的uid

getpwuid函数

功能:通过uid号获取用户的信息

原型:

 #include <sys/types.h>
 #include <grp.h>
 struct group *getgrgid(gid_t gid);

参数:

gid_t gid:指定gid号;

返回值:

成功,返回结构体指针;
失败,返回NULL;更新errno;
    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 */
           };

    struct group* grp = getgrgid(buf.st_gid);
    if(NULL == grp)
    {                                             
        ERR_MSG("getgrgid");
        return -1;
    }
    printf("%s\n", grp->gr_name);

完整代码示例: 

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <head.h>

//获取文件权限
void get_filePermission(mode_t m)   //mode_t m = buf.st_mode
{
    char buf[] = "rwx";

    for(int i=0; i<9; i++)
    {
        if( (m & (0400>>i)) == 0)
        {
            putchar('-');
            continue;
        }

        //能运行到当前位置,则代表对应位置有权限
        //需要判断是r w x中的哪一个                          
        /*
        switch(i%3)
        {
        case 0:
            putchar('r');
            break;
        case 1:
            putchar('w');
            break;
        case 2:
            putchar('x');
            break;
        }
        */

        printf("%c", buf[i%3]);

    }
    return;
}

//获取文件类型
void get_fileType(mode_t m)     //mode_t m = buf.st_mode
{
    switch(m & S_IFMT)
    {
    case S_IFSOCK: putchar('s');    break;
    case S_IFLNK: putchar('l');     break;
    case S_IFREG: putchar('-');     break;
    case S_IFDIR: putchar('d');     break;
    }

    return;
}


int main(int argc, const char *argv[])
{
    struct stat buf;
    if(stat("./01_fileno.c", &buf) < 0)
    {
        ERR_MSG("stat");
        return -1;
    }

    //文件的类型和权限
    //printf("mode: 0%o\n", buf.st_mode);
    get_fileType(buf.st_mode);
    get_filePermission(buf.st_mode);

    //文件的硬链接数
    //printf("link: %ld\n", buf.st_nlink);
    printf(" %ld", buf.st_nlink);

    //文件的所属用户
    //printf("uid: %d\n", buf.st_uid);
    //将uid转换成名字
    struct passwd* pwd = getpwuid(buf.st_uid);
    if(NULL == pwd)
    {
        ERR_MSG("getpwuid");
        return -1;
    }
    printf(" %s", pwd->pw_name);


    //文件所属组用户
    //printf("gid: %d\n", buf.st_gid);
    //将gid转换成名字
    struct group* grp = getgrgid(buf.st_gid);
    if(NULL == grp)
    {
        ERR_MSG("getgrgid");
        return -1;
    }
    printf(" %s", grp->gr_name);


    //文件大小
    //printf("size: %ld\n", buf.st_size);
    printf(" %ld", buf.st_size);

    //文件的修改时间
    printf(" time: %ld\n", buf.st_ctime);

    //文件的名字


    return 0;
}

练习4:opendir

功能:打开一个目录文件

原型:

 #include <sys/types.h>
 #include <dirent.h>
 DIR *opendir(const char *name);

参数:

 char *name:指定要打开的目录的路径以及名字;

返回值:

 成功,返回指针;
 失败,返回NULL,更新errno;

练习5:closedir

功能:关闭目录

原型:

#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);

返回值:

 成功,返回0;
 失败,返回-1,更新errno;

练习6:readdir

功能:读取目录

原型:

#include <dirent.h>
struct dirent *readdir(DIR *dirp);

返回值:

 成功,返回结构体指针:
 失败,返回NULL; 更新errno;
 目录读取完毕,返回NULL,不更新errno;
         struct dirent {
               ino_t          d_ino;       /* Inode number */
               off_t          d_off;       /* Not an offset; see below */
               unsigned short d_reclen;    /* Length of this record */
               unsigned char  d_type;      /* Type of file; not supported
                                              by all filesystem types */
               char           d_name[256]; /* Null-terminated filename */
           };


练习7:打印当前路径下所有文件的名字,除了隐藏文件

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <head.h>
#include <dirent.h>
#include <errno.h>
int main(int argc, const char *argv[])
{
	DIR* dp=opendir("./");
	if(NULL==dp)
	{
		ERR_MSG("opendir");
		return -1;
	}
	printf("opendir success\n");
	int i=0;
	while(1)
	{
		struct dirent* rp=readdir(dp);
		if(NULL==rp)
		{
			if(0==errno)
			{
				printf("目录读取完毕\n");
				break;
			}
			else
			{
				ERR_MSG("readdir");
				return -1;
			}
		}
		//判断是否是隐藏文件:以.字符开头
		if(rp->d_name[0]!='.')   //*(rp->d_name)
			printf("[%d]%s\n",++i,rp->d_name);
	}
	if(closedir(dp)<0)
	{
		ERR_MSG("closedir");
		return -1;
	}

	return 0;
}

练习8:fork

功能:创建一个子进程

原型:

 #include <sys/types.h>
 #include <unistd.h>
 pid_t fork(void);

返回值:

  成功, >0 , 在父进程中,返回创建的子进程的pid号;
         =0,   在子进程中,返回0;
  失败,返回-1,更新errno,且没有子进程被创建

注意: 

1.fork函数创建的子进程,会克隆父进程用户空间的所有资源,以及PC寄存器的值。所以子进程不会运行执行过的fork函数以及fork函数以上的代码。

(ps :PC寄存器中存储着下一次该运行到哪一行代码)

2.父子进程的虚拟地址空间不是同一块,但是由于子进程是从父进程拷贝过来的,所以fork完毕的一瞬间,父子进程的用户空间长得完全一致

3.父子进程映射的物理地址不是同一块空间

   ①写时拷贝:当父子进程均不修改其中的内容的时候,此时映射的物理地址是同一块空间。若某个进程要修改其中的内容的时候,此时才会真正的申请一块新的物理地址空间给子进程的虚拟地址映射

例题:任务1:验证虚拟地址相不相同
           任务2:验证映射的物理地址相不相同 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <head.h>
int main(int argc, const char *argv[])
{
	printf("__%d__\n",__LINE__);
	int a=10;
	//创建一个子进程
	pid_t cpid=fork();	//在fork以下的这段代码,父子进程均运行
	if(cpid>0)//在父进程中,该条件为真
	{
		a=20;
		printf("cpid=%d a=%d %p %d\n",cpid,a,&a,__LINE__);
	}
	else if(0==cpid)//在子进程中,该条件为真
	{
		sleep(1);//主动放弃CPU资源
		printf("cpid=%d a=%d %p %d\n",cpid,a,&a,__LINE__);
	}
	else
	{
		perror("fork");
		return -1;
	}
	while(1)
	{
		sleep(1);
	}

	return 0;
}

三、课后作业:

1.从终端获取一个文件的路径以及名字。

若该文件是目录文件,则将该文件下的所有文件的属性显示到终端,类似ls -l该文件夹

若该文件不是目录文件,则显示该文件的属性到终端上,类似ls -l这单个文件

#include <stdio.h>
#include <string.h>
#include <head.h> 
void get_fileType(mode_t m)
{
	if(S_ISREG(m))
		putchar('-');
	else if(S_ISDIR(m))
		putchar('d');
	else if(S_ISCHR(m))
		putchar('c');
	else if(S_ISBLK(m))
		putchar('b');
	else if(S_ISFIFO(m))
		putchar('p');
	else if(S_ISLNK(m))
		putchar('l');
	else if(S_ISSOCK(m))
		putchar('s');

	return;
} 
void get_filePermission(mode_t m)
{
	for(int i=0;i<9;i++)
	{
		if((m&(0400>>i))==0)
		{
			putchar('-');
			continue;
		}
		//能运行到当前位置,则代表对应位置有权限
		//需要判断是r  w  x当中的哪一个
		switch(i%3)
		{
		case 0:putchar('r');break;
		case 1:putchar('w');break;
		case 2:putchar('x');break;
		}
	}
	return;
}
int getstat(char *str)
{	struct stat buf;
	if(stat(str, &buf) < 0)
	{
		ERR_MSG("stat");
		return -1;
	}

	//文件的类型和权限
	printf("0%o ", buf.st_mode);
	get_fileType(buf.st_mode);   
	//文件的硬链接数
	printf("%ld ", buf.st_nlink);

	//文件的所属用户
	//printf("uid: %d\n", buf.st_uid);
	//将uid转换成名字
	struct passwd* pwd = getpwuid(buf.st_uid);
	if(NULL == pwd)
	{
		ERR_MSG("getpwuid");
		return -1;
	}
	printf("%s ", pwd->pw_name);


	//文件所属组用户
	//printf("gid: %d\n", buf.st_gid);
	//将gid转换成名字
	struct group* grp = getgrgid(buf.st_gid);
	if(NULL == grp)
	{
		ERR_MSG("getgrgid");
		return -1;
	}
	printf("%s ", grp->gr_name);
	//文件大小
	printf("%ld ", buf.st_size);
	//文件的修改时间
	struct tm* info=NULL;
	info=localtime(&buf.st_mtime);
	//printf("%ld ",buf.st_ctime);
	printf("%02d %02d %02d:%02d ",info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min);
	printf("%s\n",str);
}

int main(int argc, const char *argv[])
{
	char str[20]="";
	printf("please enter a filename:");
	scanf("%s",str);

	struct stat buf;
	if(stat(str,&buf) < 0)
	{
		ERR_MSG("stat");
		return -1;
	}

	if((buf.st_mode & S_IFMT) == S_IFDIR)
	{
		DIR * dp = opendir(str);
		if(NULL == dp)
		{
			ERR_MSG("opendir");
			return -1;
		}
		printf("open success \n");

		struct dirent *rp = NULL;
		int i=0;
		while(1)
		{
			rp = readdir(dp);
			if(NULL == rp)
			{
				if(0 == errno)
				{
					printf("读取完毕\n");break;
				}
				else
				{
					perror("readdir");
					return -1;
				}
			}
			if(*(rp->d_name) != '.')
				getstat(rp->d_name);
			//	printf("[%d]%s\n",++i,rp->d_name);
		}
		closedir(dp);
	}
	else
		getstat(str);

	return 0;
}

2.文件IO函数实现,拷贝文件。子进程先拷贝后半部分,父进程再拷贝前半部分。允许使用sleep函数。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <head.h>
int main(int argc, const char *argv[])
{
	int fd_r = open("./1.txt",O_RDONLY);
	if(fd_r < 0)
	{
		ERR_MSG("open");
		return -1;
	}
	int fd_w = open("./2.txt",O_WRONLY|O_CREAT|O_TRUNC,0664);
	if(fd_w < 0)
	{
		ERR_MSG("open");
		return -1;
	}
	off_t len = lseek(fd_r,0,SEEK_END);
	pid_t cpid = fork();
	if(cpid > 0)
	{
		sleep(1);
		lseek(fd_r,len/2,SEEK_SET);
		lseek(fd_w,len/2,SEEK_SET);
		char c;
		for(int i=len/2;i<len;i++)
		{
			if(read(fd_r,&c,1) == 0)
			{
				break;
			}
			write(fd_w,&c,1);
		}
	}
	if(0 == cpid)
	{
		lseek(fd_r,0,SEEK_SET);
		lseek(fd_w,0,SEEK_SET);
		char a;
		for(int j=0;j<len/2;j++)
		{
			if(read(fd_r,&a,1) == 0)
			{
				break;    
			}
			write(fd_w,&a,1);
		}
	}
	close(fd_r);
	close(fd_w);

	return 0;
}    

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

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

相关文章

C++设计模式之装饰者模式

文章目录 C装饰者设计模式什么是装饰者模式优缺点优点缺点 如何使用 C装饰者设计模式 什么是装饰者模式 装饰者模式是一种设计模式&#xff0c;它允许我们动态地将行为附加到对象上&#xff0c;而无需改变对象本身的定义。它将一个对象的行为包装在一个独立的的对象中&#xf…

数据库事务--数据库事务隔离级别实战

2、演示环境 数据库及工具 ➢MySQL版本 5.5.47 ➢数据库工具 Navicat for MySQL 数据库命令 ➢查看数据库版本: select version();➢查看数据库现在的隔离级别: select session.tx_ isolation;➢修改隔离级别: set session.tx_ _isolation级别参数;➢级别参数: READ-UN…

内网横向移动—非约束委派约束委派

内网横向移动—非约束委派&约束委派 1. 委派攻击介绍1.1. 约束委派分类 2. 非约束委派2.1. 配置非约束委派2.1.1. 域内主机配置2.1.2. 注册对象2.1.3. 域内用户配置 2.2. 案例测试2.2.1. 查询服务账户2.2.2. 查询机器账户2.2.3. 机器通讯2.2.4. 导出票据2.2.5. 导入票据2.2…

算法题--二叉树(二叉树的最近公共祖先、重建二叉树、二叉搜索树的后序遍历序列)

目录 二叉树 题目 二叉树的最近公共祖先 原题链接 解析 二叉搜索树的最近公共节点 核心思想 答案 重建二叉树 题目链接 解析 核心思想 答案 二叉搜索树的后序遍历序列 原题链接 解析 核心思想 答案 二叉树 该类题目的解决一般是通过节点的遍历去实现&#x…

edge://settings/defaultbrowser default ie

Microsoft Edge 中的 Internet Explorer 模式 有些网站专为与 Internet Explorer 一起使用&#xff0c;它们具有 Microsoft Edge 等新式浏览器不支持的功能。 如果你需要查看其中的某个网站&#xff0c;可使用 Microsoft Edge 中的 Internet Explorer 模式。 大多数网站在新…

优先级队列 (堆)

目录 一&#xff0c;堆的概念 二&#xff0c; 堆的存储结构 三&#xff0c; 堆的实现 3.1 shiftDown() 3.2 shiftUp() 3.3 shiftDown 与 shiftUp 的时间复杂度 四&#xff0c;堆排序 一&#xff0c;堆的概念 堆常用于实现优先队列&#xff08;Priority Queue&#xff0…

【算法训练营】求最小公倍数+另类加法+走方格的方案数

7月31日 求最小公倍数题目题解代码 另类加法题目题解代码 走方格的方案数题目题解| 1 | 2 | 3 || 4 | 5 | 6 || 7 | 8 | 9 |代码 求最小公倍数 题目 点击跳转: 求最小公倍数 题解 最小公倍数 两数之积除以最大公约数&#xff0c;这里使用碾转相除法进行最大公约数的求解&am…

学习盒模型

1.是什么 2.标准模型 3.怪异模型 一、是什么 一个盒子由四部分组成&#xff1a; content、padding、border、margin 在CSS中&#xff0c;盒子模型可以分成&#xff1a; W3C 标准盒子模型IE 怪异盒子模型 默认情况下&#xff0c;盒子模型为W3C标准盒模型 二、标准盒模型 盒子总…

NetApp FAS存储系统磁盘更换详细步骤

说起更换磁盘&#xff0c;都会说非常简单&#xff0c;但无数次的血淋淋的教训让我们再次来审视一下更换磁盘的专业步骤。本文就是介绍最专业的也是最简单的磁盘更换步骤。常在河边走哪有不湿鞋&#xff0c;希望做了几十年攻城狮的你不要在这里翻船。 本文介绍的内容适用于Onta…

ELK日志管理平台架构和使用说明

一、部署架构 二、服务注册 2.1 日志解析服务 服务名&#xff1a;日志解析服务&#xff08;Logstash&#xff09; 服务默认端口&#xff1a;9600 2.2 日志查询服务 服务名&#xff1a;日志查询服务&#xff08;Kibana&#xff09; 服务默认端口&#xff1a;5601 三、对接…

光纤激光切割机是否属于环保设备

光纤激光切割机不属于环保设备。 环保设备是指用于控制环境污染、改善环境质量而由生产单位或建筑安装单位制造和建造出来的机械产品、构筑物及系统。 单纯的激光切割机当前是豁免环评的&#xff0c;比起普通二氧化碳激光切割机更节省空间和气体消耗量&#xff0c;光电转化率高…

C语言手撕单链表

一、链表的概念 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;也就是内存存储不是像顺序表那么连续存储&#xff0c;而是以结点的形式一块一块存储在堆上的&#xff08;用动态内存开辟&#xff09;。 既然在内存上不是连续存储&#xff0c;那我们如何将这一…

代码随想录算法训练营第二十八天 | Leetcode随机抽题检测

Leetcode随机抽题检测--使用题库&#xff1a;Leetcode热题100 1 两数之和未看解答自己编写的青春版重点题解的代码日后再次复习重新写 49 字母异位词分组未看解答自己编写的青春版重点题解的代码日后再次复习重新写 128 最长连续序列未看解答自己编写的青春版重点关于 left 和 …

谷歌浏览器提示客户端和服务器不支持一般 SSL 协议版本或加密套件(亲测有效)

目录 一、定位问题二、升级TLS1.21、原理之前架构调整架构 2、配置nginx3、配置tomcat 三、访问nginx即可 最近访问一部分网站时&#xff0c;出现如下图所示 “ 此网站无法提供案例连接&#xff0c;客户端和服务器不支持一般 SSL 协议版本或加密套件 ” 的问题。 一、定位问题…

AIGC之AI绘画行业发展研究报告(2023)

全部140页&#xff0c;完整版pdf下载见文末。 链接&#xff1a;AIGC之AI绘画行业发展研究报告&#xff08;2023&#xff09; 提取码&#xff1a;关注 未来人智慧 回复 AIGC之AI绘画行业发展研究报告&#xff08;2023&#xff09;

C语言每日一题:11.《数据结构》链表分割。

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a;使用带头链表 1.构建两个新的带头链表&#xff0c;头节点不存储数据。 2.循环遍历原来的链表。 3.小于x的尾插到第一个链表。 4.大于等于x尾插到第二个链表。 5.进行链表合并&#xff0c;注意第二个链表的尾的下一…

IO进程线程第四天(8.1)

作业1&#xff1a; 从终端获取一个文件的路径以及名字。 若该文件是目录文件&#xff0c;则将该文件下的所有文件的属性显示到终端&#xff0c;类似ls -l该文件夹 若该文件不是目录文件&#xff0c;则显示该文件的属性到终端上&#xff0c;类似ls -l这单个文件 #include<…

ad+硬件每日学习十个知识点(16)23.7.27 (总线保持、lin报文、逻辑器件手册解读)

文章目录 1.总线保持是怎么实现的&#xff1f;有什么需要注意的&#xff08;驱动电流和电阻&#xff09;&#xff1f;2.LIN报文3.芯片datasheet的features、applications、description看完&#xff0c;应该能大致判断逻辑器件能否满足我们的要求。4.什么是逻辑器件的传输延时&a…

系统架构设计师_备考第1天

文章目录 前言一、软考历史与体系二、考试价值与意义三、软考报名与交费四、考试介绍五、综合备考策略 前言 从今天开始&#xff0c;会认真备考系统架构设计师&#xff0c;希望95天后&#xff0c;拿下软考证书。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可…

P3372 【模板】线段树 1(内附封面)

【模板】线段树 1 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某区间每一个数加上 k k k。求出某区间每一个数的和。 输入格式 第一行包含两个整数 n , m n, m n,m&#xff0c;分别表示该数列数字的个数和操作的总个数。 …