Linux考点

选填

  1. linux中把分区和目录对应的过程叫做 挂载

  2. 信号是在软件层次上对 中断 机制的一种模拟, 是一种异步通信方式。

  3. 用GCC编译过程可以被细分为四个阶段: 预处理,编译,汇编,连接

  4. 编译有线程的文件要加 -lpthread 参数。

  5. 父进程等待子进程的结束,可以使用的函数是 wait( ) 和 waitpid( )

  6. linux主要有两个信号安装函数,分别是signal( ),sigaction( )

  7. Linux操作系统内核由 C和汇编 编写完成。

  8. 使用gdb调试程序时,,next和step命令的作用?

next:单步运行,不进入函数内部;setp单步运行,进入函数内部

  1. 目录 /boot 下存放linux操作系统启动时所要用到的程序

  2. Linux 系统的设备文件分为三类?

字符设备文件、块设备文件和网络设备文件

  1. Linux 中采用“一对一”的线程机制,也就是一个用户线程对应一个 内核线程

  2. vim三种模式:在命令模式下按下 就进入了底线命令模式。

  3. 标准I/O提供了三种类型的缓冲,分别是?

全缓冲,行缓冲,不带缓冲

  1. 一个完整的信号生命周期包含4个重要的事件,这4个重要事件分别是?

信号诞生 信号在进程中注册 信号在进程中注销 信号处理函数执行完毕

  1. 互斥锁只有两种状态,即?开锁和上锁

  2. 线程本身调用 pthread_exit() 函数可以退出线程。

  3. 向消息队列发送消息的函数是 msgrcv()

  4. stat 系统调用可以根据文件描述符来操作文件特性。

  5. Valgrind包括很多工具, Memcheck 是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况, Cachegrind 是主要用来检查程序中缓存使用出现的问题。

  6. 信号发送函数中, setitimer() 用于设置定时器,当计时时间到达时,向进程发送SIGALRM信号。

  7. 在标准IO库中,rewind函数作用? 将文件流指针指向文件起始位置

  8. c语言中没有明确给定初值的全局变量和静态变量存放在哪儿?未初始化数据区

  9. 函数geteuid()用于得到进程的?用户有效UID

  10. 当一个线程的属性设置为 分离状态 ,该线程结束时立即释放它所占有的系统资源。

  11. 以下哪种方式属于异常终止一个进程?接到一个信号并终止

  12. 下列命令哪个是创建线程私有数据命令? pthread_key_create()

  13. 下面哪种通信方式适用于不同机器之间的进程通信?套接字

  14. 创建或打开消息队列的函数为?msgget()

  15. 什么是进程?进程资源由哪两部分组成?

进程是可并发执行的程序在某个数据集合上的一次计算活动,也是操作系统进行资源分配和调度的一个独立单位。

进程资源由内核空间资源(PCB控制块) 和 用户空间资源

  1. linux中通过调用waitpid()函数得到进程的退出信息,该函数原型为

*pid_t waitpid(pit_t pid, int statloc, int options);当第一个参数pid取值为-1时,表示等待任一子进程退出,相当于 wait()。

  1. pid_t fork() 返回值的意义?

若执行成功,父进程中将返回子进程(新创建的进程)的PID,类型为pid_t,

子进程将返回0,以区别父子进程

若执行失败,则在父进程中返回-1,错误原因存储在errno中

  1. Linux环境中使用kill函数向进程或进程组发送信号。Kill函数原型为

int kill(pid_t pid, int signo);当第一个参数pid>0时,表示发送信号给进程ID为pid的进程;

  1. 共享主存基本操作**shmat()**将共享主存区映射到进程虚拟地址空间。

  2. 修改消息队列状态信息的命令是msgctl()

  3. 一个进程是 (PCB 结构与程序和数据的组合)。

  4. 一个进程调用 wait 或 waitpid 函数,可能产生 3 中情况,下列不属于这 3 种

    情况的是 (D )。

    A、如果所有子进程都还在运行,进程挂起。

    B、如果恰有子进程结束,它的终止状态字正等待父进程提取,立即得到该终止状态字并返回,其返回值为该子进程的进程号。

    C、waitpid,如果该进程没有子进程,参3指定了WNOHANG,返回0。

    D、如果该进程没有子进程,立即返回,返回值为 0。

  5. 返回调用进程的进程标识号的系统函数是 (getpid)

  6. 程序和进程是两个不同的概念,以下不能描述这个观点的是同一个程序运行 10 次,产生的是同一个进程。

A、程序指出了处理器执行操作的步骤,而进程是一个程序在一个数据集合上

的一次执行。

C、进程是动态的,是程序的执行过程。

D、多个不同的进程可以包含相同的程序。

  1. Fork 函数在父进程中的返回值是创建的子进程的进程标识号

  2. 在 Linux 中,下列不属于正常结束进程的方法是调用 abort函数

  3. 哪种进程之间的通信,数据不可以重复读 fifo 管道

  4. 下述是Linux下多线程编程常用的pthread库提供的函数名和意义,说法不正确的是D

    A、pthread_create 创建一个线程

    B、pthread_join用来等待一个线程的结束

    C、pthread_mutex_init 初始化一个线程互斥锁

    D、pthread_exit杀死一个线程

  5. 对互斥锁及条件变量说法不正确的是:D

    A、互斥锁保证让每个线程对共享资源按顺序进行原子操作

    B、条件变量是让线程睡眠,在符合某种条件时唤醒睡眠的线程

    C、条件变量可以让多个线程在某一时间上保持同步

    D、在使用条件变量时,互斥锁会失去作用,所以是否有互斥锁关系不重要

  6. 线程A SendMessage给线程B,线程B处理该消息时又SendMessage给线程A,会出现:继承执行

  7. linux文件系统通常由四部分组成:引导块,超级块,索引节点和数据块

  8. 任何进程在运行时默认打开的三个流对象,都有相应的文件描述符,标准文件描述符定义标准输入设备的值为0

  9. 在创建文件和目录时候,有默认权限。如果umask值为0022,则文件的默认权限为 0644

  10. 获取目录的系统调用函数为getcwd()

小题

gcc编译生成.out

编译cpp:gcc main.cpp -o a.out

执行a.out:./a.out

生成.o文件:gcc -c hello.cpp

得到hello.o,由于是中间文件,所以无法执行

gdb调试

可完成调试任务(1)设置断点(2)监视程序变量的值(3)程序的单步执行(4)修改变量的值

vi编辑器

iIaAoO任一字符可进入插入模式

dd删除光标所在那一行

工具

库函数和系统调用的区别

库函数:由系统提供,用户无须定义,也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用 如使用printf return

系统调用:操作系统的一部分;用户应用程序访问并使用内核所提供的各种服务的途径即是系统调用。如exit

open打开的标记五个

O_RDONLY 以仅读方式打开文件

O_WRONLY 以仅写方式打开文件

O_RDWR 以读和写的方式打开文件

上面三个仅能选择一个。以下的能够合理的随意组合:

O_CREAT 不存在则建立文件

O_EXCL 假设已经置O_CREAT且文件存在。则强制open()失败 O_TRUNC 将文件的长度截为0 O_APPEND 强制写入文件尾部,上面四个无效,

简述虚拟文件系统

Linux虚拟文件系统是一个异构文件系统之上的内核软件层(软件粘合层),用来处理与UNIX标准文件系统相关的所有系统调用。其健壮性表现在能为各种文件系统提供一个通用的接口。

在Linux系统下,有七类文件类型:

普通文件,目录,软链接套接字文件,字符设备,块设备,管道文件(命名管道P)

软连接与硬链接

1)软连接有自己的文件属性及权限等 2)可对不存放在的文件或者目录创建软连接 3)软链接可跨分区创建 4)软连接可对文件或目录创建 5)创建软链接时,链接计数不会增加 6)删除软链接并不影响被指向的文件,原文件被删除的软链接被称为死链接,若被指向路径文件被重新创建,死链接可恢复为正常。

硬链接是已存在文件的另一个名字

(1)文件有相同的indoe 及文data block (2)只能对已存的文件进行创建 (3)删除一个硬链接文件并不影响其他有相同ionde 号的文件

限制:(4)不能给目录创建硬链接(5)只有同一文件系统中的文件之间才能创建硬链接。不能跨分区创建

区别:目录,跨文件系统,不存在

什么是进程

进程是计算机中程序的一次数据集合运算的活动,是系统进行调度和分配的基本单元,是操作系统的基础

进程资源由两部分组成

内核空间进程资源,用户空间进程资源

Linux进程结构

1)代码区(text segment) (2)全局初始化数据区/静态数据区(Data Segment)

(3)未初始化数据区(BSS) (4)栈区stack (5)堆区heap

进程和程序的区别

(1)程序是永存的;进程是暂时的,是程序在数据集上的一次执行,有创建有撤销,存在是暂时的;

(2)程序是静态的观念,进程是动态的观念;

(3)进程具有并发性,而程序没有;

(4)进程是竞争计算机资源的基本单位,程序不是。

(5)进程和程序不是一一对应的: 一个程序可对应多个进程即多个进程可执行同一程序; 一个进程可以执行一个或几个程序

Linux进程的状态

运行就绪状态:TASK_RUNNING

处于等待队伍中,可中断唤醒:TASK_INTERRUPTIBLE

处于等待队伍中,不可中断唤醒:TASK_UNINTERRUPTIBLE

进程资源用户空间被释放,等待父进程回收:TASK_ZOMBIE

进程被外部程序暂停,可被唤醒:TASK_STOPPED

fork返回值的意义

​ Fork表示创建一个进程,其在父进程中返回值为子进程的id号,在子进程中返回值为0,如果创建失败则会返回-1,并且显示报错信息。

进程中 return 和 exit 的区别

Return是语言级别的,其表示了堆栈的返回和处理,而exit是系统调用级别的,其表示了结束一个进程,当在main函数中return和exit效果一样都是代表了结束一个进程,并且return 0和exit(0)都是返回了进程的结束状态。

什么是孤儿进程谁回收孤儿进程的

孤儿进程就是其在正常运行时,父进程已经结束,导致其内核资源无法被父进程回收,孤儿进程在父进程结束时将会把父进程设置为init进程。

僵尸进程是什么如何消除

僵尸进程就是进程已经结束但是其内核资源未被父进程进行回收处理,可以通过命令将僵尸进程的父进程杀死,然后僵尸进程就会把父进程设置为init,init会对其进行回收。

fork 和 vfork 区别

Fork和vfork都代表了创建一个子进程

  1. fork ():子进程拷贝父进程的数据段,代码段,成为一个独立的实体

vfork ( ):子进程与父进程共享数据段

  1. fork ()父子进程的执行次序不确定

vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec或exit 之后父进程才可能被调度运行。

父进程调用 wait 出现的三种情况常见进程状态

当子进程都在执行时,wait会使父进程进入阻塞状态

当恰好有子进程结束时,wait会回收子进程资源并且获得子进程结束状态

当无子进程时wait会立刻返回-1 并且显示报错信息

常见的调度策略

1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略,先到先服务 3,SCHED_RR实时调度策略,时间片轮转

进程通信的目的

1、数据传输:一个进程需要将它的数据发送给另一个进程;

2、资源共享:多个进程间共享同样的资源;

3、通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事情,比如进程终止时需要通知其父进程;

4、进程控制:有些进程希望完全控制另一个进程的执行,比如Debug进程,此时控制进程希望能够拦截另一个进程的所有陷入和异常,且能够及时知道它的状态改变。

其实简单来讲,本质就是让不同的进程共享同一份资源。

简述进程对可靠信号和不可靠信号的处理

当一个进程设置了信号屏蔽集时,向其发送多个同样的屏蔽信号,不可靠信号不管发送了几次,进程的未决信号集只会记录一次,当解除屏蔽后也只会捕捉一次,而可靠信号发送几次就会被记录几次,当结束屏蔽时,也会同样捕捉几次

信号的定义及其分类 通信进程的分类

定义:信号是表示消息的物理量,是消息传递的载体,信号是模拟中断的一种方式,其是软件层面的中断,在原理上,一个进程捕获一个信号和处理器收到一个中断请求是一样的

分类:确定信号和随机信号;连续信号和离散信;周期信号和非周期信号;能量信号与功率信号;因果信号与反因果信号;实信号与复信号

(2)进程间通信主要包括管道, 系统IPC(包括消息队列,信号,共享存储), 套接字(SOCKET)

进程间常见的通讯方式和4个目的

方式:1.管道2.信号3.消息队列4.共享内存

目的: 1.数据传输2.资源共享3.通知事件4.进程控制

有名管道和匿名管道的区别

1,匿名管道只能用于具有亲缘关系的两个进程间的通信,而命名管道可以用于任何两个进程间的通信,要灵活方便许多。

2,匿名管道无需显式打开,创建时返回文件描述符,读写时需确定对方的存在,及阻塞于读写位置,有名管道在打开时需要确定对方存在。

3,命名管道是一种特殊的文件类型,而且存在于文件系统中。所以,当通信进程使用完命名管道后,如果没有对其进行删除该文件依然存在。而匿名管道只存在于内存中,无法在文件系统中查看。

概述匿名管道及特点

无名管道是一种特殊类型的文件,在内核中对应的资源即一段特殊内存空间,内核在这段空间中以循环队列的方式临时存入一个进程发送给另一个进程的信息。匿名管道用于进程之间通信,且仅限于本地父子进程之间通信,结构简单。

特点

1.半双工,数据在同一时刻只能在一个方向行流动。

2.数据只能从管道的一段写入,从另一端读出。

3.写入管道的数据遵循先进先出的规则。

匿名管道生命周期随进程的结束而结束

匿名管道是基于字节流来通信的 其本身有同步互斥的效果

匿名管道只能使用于有血缘关系的进程之间的通信

please sinnal and sigaction 的区别

不同点:1.Signal只能调用信号处理函数,但是无妨向其输入附带的数据

Sigaction可以向信号处理函数传递信息,并且可以设置信号掩码,返回设置之前的sigaction

2.signal在调用过程不支持信号block;sigaction调用后在handler调用之前会把屏蔽信号加入信号中,handler调用后会自动恢复信号到原先的值。

3.signal处理过程中就不能提供阻塞某些信号的功能,sigaction就可以阻指定的信号和本身处理的信号,直到handler处理结束。这样就可以阻塞本身处理的信号,到handler结束就可以再次接受重复的信号。

3、sigaction提供了比signal多的多的功能

相同点:都可以为信号设置信号处理函数 共用了同一个内核函数do_sigaction

linux 系统中信号的处理方式

忽略此信号 自定义捕捉信号方式 执行系统默认操作

产生信号的方式 5 种

1.通过终端按键(组合键)产生信号

2.硬件异常产生的信号

3.调用系统函数向进程发信号

4.由软件条件产生信号

5.命令产生

简述信号生命周期

在目的进程中安装信号->信号的产生–>信号的注册–>信号的注销–>信号生命终止

简述什么是线程及特点

线程就是系统运算执行的最小单位,其所占资源较少

线程是进程的一个执行序列

线程可以看作是轻量化的进程,线程之间的切换代价小

所有的线程都是对等的关系,没有父线程的概念。

pthread cancle 和 pthread exit 区别

Pthread_exit()是结束本线程

Pthread_cancel()是结束其他线程

互斥锁与读写锁区别联系

区别:1)读写锁区分读者和写者,而互斥锁不区分

2)互斥锁同一时间只允许一个线程访问该对象,无论读写;读写锁同一时间内只允许一个写者,但是允许多个读者同时读。

联系:两种都是锁,其都可以解决线程的互斥同步的线程安全问题,无论在什么时候只允许一个线程对资源进行操作,读写锁则可以再读时运行多个线程进行操作,写时只允许一个线程进行操作。

条件变量中 pthread _ cond _ wait () 实现步骤

解锁 判断条件是否成立 如果成立则上锁执行,不成立将进入阻塞状态。

线程与进程定义和区别

进程:指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令、数据和堆栈等组成的,是一个能独立运行的活动实体。

线程:线程是进程中的一个实体,作为系统调度和分派的基本单位。

区别:(1)进程和线程的主要区别在于:每个进程都需要操作系统为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址空间中工作,(2)进程是运行中的程序,线程是进程的内部的一个执行序列(3)进程是资源分配的单元,线程是执行单元(4)进程间切换代价大,线程间切换代价小(5)进程拥有资源多,线程拥有资源少(6)多个线程共享进程的资源。

tcp udp 的区别

连接方面区别:TCP面向连接UDP是无连接的,即发送数据之前不需要建立连接。

安全方面的区别:TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。UDP尽最大努力交付,即不保证可靠交付。

传输效率的区别:TCP传输效率相对较低。UDP传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。

连接对象数量的区别:TCP连接只能是点到点、一对一的。UDP支持一对一,一对多,多对一和多对多的交互通信。

tcp 的三次握手

连接建立,数据传输,连接释放

osi 七层模型

​ 1. 物理层 2. 数据链路层 3. 网络层 4. 传输层 5. 会话层 6. 表示层 7. 应用层

编程大题

大小写

1.创建文件file1,写入字符串“abcdefghijklmn”;
2.创建文件file2,写入字符串“ABCDEFGHIJKLMN”;
3.读取file1中的内容,写入file2,使file2中的字符串内容为“ ABCDEFGHIJKLMNabcdefghijklmn”

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include <fcntl.h>

int main()

{

int file1,file2;

char str[20]={'0'};

file1 = open("./file1.txt",O_RDWR|O_CREAT,0777);

file2 = open("./file2.txt",O_RDWR|O_CREAT,0777);

write(file1,"abcdefghijklmn",14);  

lseek(file2, 17, SEEK_SET);

write(file2,"ABCDEFGHIJKLMN",14);  

lseek(file1, 0, SEEK_SET);

read(file1,str,14);

lseek(file2, 0, SEEK_SET);

write(file2,str,14);

close(file1);

close(file2);

return 0;

}

文件描述符

1.创建新文件,该文件具有用户读写权限。
2.采用dup/dup2/fcntl复制一个新的文件描述符,通过新文件描述符向文件写入“class_name”字符串;
3.通过原有的文件描述符读取文件中的内容,并且打印显示

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

#include<stdlib.h>

#include<fcntl.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<string.h>

int main(int argc,char argv[])

{

int fd;

fd=open("test2.file",O_CREAT|O_WRONLY,S_IREAD|S_IWRITE);

char *name="class_name";

int fd2 = dup(fd);

if(fd2<0){

perror("dup");

}

write(fd2,name,strlen(name));

lseek(fd,0,SEEK_SET);

char str[12];

read(fd,str,12);

printf("%s\n",str);

close(fd);

return 0;

}

fork打印

编写代码实现以下功能:

1.打印字符串“hello world!”

2.在打印字符串“hello world!”前调用三次fork,分析打印结果。

\

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

int main()

{

int i;

for(i=0;i<3;i++)

{

fork(); 

}

printf("hello world!!!\n");

return 0;

}

遍历目录

1.递归遍历/home目录,打印出所有文件和子目录名称及节点号。
2.判断文件类型,如果是子目录,继续进行递归遍历,直到遍历完所有子目录为止.

\

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <fcntl.h>

#include <errno.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <dirent.h>

int show (char * path)

{

char p[500];

DIR *dir;

struct stat statbuf;

struct dirent *dire;

lstat (path,&statbuf);

if (S_ISDIR(statbuf.st_mode))

{

dir = opendir (path);

if (dir)

{

while( (dire = readdir(dir) ) !=NULL)

{

if(( dire ->d_name[0] )=='.')

continue;

sprintf(p,"%s/%s",path,dire->d_name);

lstat(p,&statbuf);

printf ("\t该目录文件名为: %s \n",p);

printf ("\t该目录文件节点号为: %ld \n",statbuf.st_ino);

show (p);

}

}

}

if (S_ISREG(statbuf.st_mode)){

printf ("该文件名为: %s \n",path);//输出文件名

printf ("该文件节点号为: %ld \n",statbuf.st_ino);

}

}

int main()

{

show("/home");

return 0;

}

1.在子进程中打开文件file1,写入自己的“班级_姓名_学号”,

2.父进程读取file1中的内容,并且打印显示。

3.在父进程中获取已经结束的子进程的状态信息,打印该信息,并且打印结束的子进程的进程号。

\

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <fcntl.h>

#include <sys/wait.h>

int main()

{

int fd,pid;

fd = open("file",O_CREAT|O_RDWR,S_IRWXU);

if(fd< 0){

perror("open");}

pid = fork();

if(pid == 0)

{

printf("This is the child!\n");

char str[128]= "zhinengsanban_liaoxianqiang_1915925583";

if(write(fd,str,128) < 0){

perror("write");}

exit(5);

}

else

{

printf("This is the father!\n");

char buf[128];

int n,status;

if(read(fd,buf,128) < 0){

perror("read");}

printf("The buf is: %s\n",buf);

if(wait(&status) < 0){

perror("perror");}

if(WIFEXITED(status)){

n = WEXITSTATUS(status);}

else{

printf("wait error!\n");}

printf("The child's pid is: %d\n",pid);

printf("The child exit status is: %d\n",n);

}

return 0;

}

管道读写

利用有名管道文件实现进程间通信,要求

写进程向有名管道文件写入10次“hello world”;

读进程读取有名管道文件中的内容,并依次打印

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <unistd.h>

#include <sys/stat.h>

int main()

{

int pid,fd;

if(mkfifo("fifotest",0666) < 0)

 perror("mkfifo");

pid = fork();

if(pid < 0)

 perror("fork");

else if(pid == 0)

{

printf("This is the write process!\n");

int fd = open("fifotest",0666);

for(int i = 0; i < 10;i++)

{

if(write(fd,"hello world",12) < 0)

perror("write");

sleep(1); 

}

close(fd);

}

else

{

char str[128];

printf("This is the read process!\n");

int fd1 = open("fifotest",0666);

 

for(int i = 0;i < 10;i++)

{

if(read(fd1,str,128) < 0)

 perror("read");

else

 printf("%s\n",str);

}

system("rm -f fifotest");

}

}

管道读写

利用有名管道文件实现进程间通信,要求

写进程向有名管道文件写入10次“hello world”;

读进程读取有名管道文件中的内容,并依次打印

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <unistd.h>

#include <sys/stat.h>

int main()

{

int pid,fd;

if(mkfifo("fifotest",0666) < 0)

 perror("mkfifo");

pid = fork();

if(pid < 0)

 perror("fork");

else if(pid == 0)

{

printf("This is the write process!\n");

int fd = open("fifotest",0666);

for(int i = 0; i < 10;i++)

{

if(write(fd,"hello world",12) < 0)

perror("write");

sleep(1); 

}

close(fd);

}

else

{

char str[128];

printf("This is the read process!\n");

int fd1 = open("fifotest",0666);

 

for(int i = 0;i < 10;i++)

{

if(read(fd1,str,128) < 0)

 perror("read");

else

 printf("%s\n",str);

}

system("rm -f fifotest");

}

}

可能会考到的实验

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值