收藏 分销(赏)

Linux程序设计知识点整理.docx

上传人:二*** 文档编号:4565952 上传时间:2024-09-30 格式:DOCX 页数:71 大小:4.40MB
下载 相关 举报
Linux程序设计知识点整理.docx_第1页
第1页 / 共71页
本文档共71页,全文阅读请下载到手机保存,查看更方便
资源描述
Prerequisite 一、Linux 命令 1、文件操作 列出目录内容: ls, dir, vdir 创建特殊文件: mkdir, mknod, mkfifo 文件操作: cp, mv, rm 修改文件属性: chmod, chown, chgrp, touch 查找文件: locate, find 字符串匹配: grep(egrep) 其它: pwd, cd, ar, file, grep, tar, more, less, head, tail, cat 2、进程操作 ps, kill, jobs, fg, bg, nice 3、其它 who, whoami, passwd, su, uname, … man 二、Linux工具 编辑工具:vi, emacs 编译、链接:gcc(GNU C Compiler -> GNU Compiler Collection) 调试:gdb make命令 版本控制工具:CVS等 三、编程语言 1、High-level Language:C/C++, Java, Fortran… 2、ELF binary format:Excutable and Linkable Format(工具接口标准委员会(TIS)选择了正在发展中的ELF体系上不同操作系统之间可移植的二进制文件格式) 四、GCC使用 -E: 只对源程序进行预处理(调用cpp预处理器) -S: 只对源程序进行预处理、编译 -c: 执行预处理、编译、汇编而不链接 -o output_file: 指定输出文件名 -g: 产生调试工具必需的符号信息 -O/On: 在程序编译、链接过程中进行优化处理 -Wall: 显示所有的警告信息 -Idir: 指定额外的头文件搜索路径 -Ldir: 指定额外的库文件搜索路径 -lname: 链接时搜索指定的库文件 -DMACRO[=DEFN]: 定义MACRO宏 Gcc过程:预处理、编译、汇编、链接 GDB使用 设置断点、监视变量值、单步执行、修改变量值 make [-f filename] [targetname] Shell编程 一、 Shell概述 1、Shell 用户和操作系统之间的接口、作为核外程序而存在 2、Shell 的双重角色 1)、命令解释程序 (1)Linux的开机启动过程:加载BIOS;读取MBR(Master Boot Record);Boot Loader;加载内核;用户层init依据inittab文件来设定运行等级;init进程执行rc.sysinit;启动内核模块;执行不同运行级别的脚本程序;执行/etc/rc.d/rc.local;执行/bin/login程序,进入登录状态 (2)进程树:进程树是一种进程关系表示方法。由父进程和子进程两部分组成。 (3)Shell的工作步骤:打印提示符;得到命令行;解析命令;查找文件;准备参数;执行命令 2)独立的程序设计语言解释器 (1)KISS (Keep It Small and Stupid) (2)Reusable tools (3)Redirection and pipe 二、创建和执行Shell程序 1、编写脚本文件(注释、退出码(exit 0)) 2、执行脚本文件 方法1:$ sh script_file 方法2:chmod +x script_file (chown, chgrp optionally) ./script_file 方法3:source script_file, or . script_file 1、 在当前bash环境下新建一个子shell来执行这个脚本,继承父Shell的环境变量,用于执行刚修改的初始化文档, 2、这些子shell(即子进程)使脚本并行地,有效率地地同时运行脚本内的多个子任务。由于是在子shell中执行,脚本设置的变量不会影响当前shell。 3、source的程序主体是bash,脚本中的$0变量的值是bash,而且由于作用于当前bash环境,脚本中set的变量将直接起效 三、Shell程序设计的语法 1、变量 1、用户变量: (1)定义:用户在shell脚本里定义的变量 (2)赋值和使用: var=value echo $var (3)read命令:(read -p "Enter your name:" name) read var 或 read REPLY variable(环境变量REPLY中包含输入的所有数据,可以像使用其他变量一样在shell脚本中使用环境变量REPLY,当然,在引用的时候不要忘记$) -s:默读、在输入密码时用的到 -t:计时输入,后接等待秒数 (4)引号的用法: 双引号作用:$ ,\ ,`这些字符的特殊含义还是存在 单引号:忽略所有的特殊字符 2、用户环境 (1).bash_profile, .bash_logout, .bashrc files .bash_profile: 用户登录时被读取,其中包含的命令被bash执行 .bashrc: 启动一个新的shell时读取并执行 .bash_logout: 登录退出时读取执行 (2)Alias:alias[别名]=[指令名称],若不加任何参数,则列出目前所有的别名设置。 alias的效力仅及于该次登入的操作。若要每次登入是即自动设好别名,可在/etc/profile或自己的~/.bashrc中设定指令的别名。 Unalias [别名] (3)环境变量: export [-fnp][变量名称]=[变量设置值] -f  代表[变量名称]中为函数名称。 -n  删除指定的变量。变量实际上未删除,只是不会输出到后续指令的执行环境中。 -p  列出所有的shell赋予程序的环境变量。 env:显示当前用户的环境变量; set:用set 命令可以设置各种shell选项或者列出shell变量 -a 标示已修改的变量,以供输出至环境变量。 -b 使被中止的后台程序立刻回报执行状态。 -C 转向所产生的文件无法覆盖已存在的文件。 -d Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。-d参数可取消。 -e 若指令传回值不等于0,则立即退出shell。 -f 取消使用通配符。 -h 自动记录函数的所在位置。 -H Shell 可利用"!"加<指令编号>的方式来执行history中记录的指令。 -k 指令所给的参数都会被视为此指令的环境变量。 -l 记录for循环的变量名称。 -m 使用监视模式。 -n 只读取指令,而不实际执行。 -p 启动优先顺序模式。 -P 启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。 -t 执行完随后的指令,即退出shell。 -u 当执行时使用到未定义过的变量,则显示错误信息。 -v 显示shell所读取的输入值。 -x 执行指令后,会先显示该指令及所下的参数。 +<参数> 取消某个set曾启动的参数。 3、环境变量(Shell环境提供的变量。通常使用大写字母做名字) 4、参数变量和内部变量 调用脚本程序时如果带有参数,对应的参数和额外产生的一些变量。 2、条件测试 1、字符串比较 2、算数比较 3、与文件有关的条件测试 4、逻辑操作 5、条件语句 (1)形式:(紧凑形式; (同一行上多个命令的分隔符)) if [ expression ] then statements elif [ expression ] then statements elif … else statements fi 6、case语句 (1)形式: case str in str1 | str2) statements;; str3 | str4) statements;; *) statements;; Esac 3、重复语句 1、for语句:适用于对一系列字符串循环处理 (1)形式: for var in list do statements done 例: #!/bin/sh for file in $(ls f*.sh); do lpr $file done exit 0 2、while语句 (1)形式: while condition do statements done 3、until 语句(不推荐使用) (1)形式: until condition do statements done 4、Select语句:生成菜单列表 (1)形式: select item in itemlist do statements done 4、命令表业语句块 1、命令表 (1)命令组合 分号串联:command1 ; command2 ; … 条件组合: AND命令表:只有在 && 左边的命令返回真,&& 右边的命令才会被执行 格式:statement1 && statement2 && statement3 && … OR命令表:只有在 || 左边的命令返回假,|| 右边的命令才会被执行。 格式:statement1 || statement2 || statement3 || … 2、语句块 (1)形式 { statement1 statement2 … } 或 { statement1; statement2 ; … ; } 5、函数 (1)形式 [function] funcname() { statements [return int] } (2)局部变量:局部变量只适用于当前shell,local关键字 (3)函数的调用:func para1 para2 … 6、其他 1、杂项命令: break: 从for/while/until循环退出 continue: 跳到下一个循环继续执行 exit n: 以退出码”n”退出脚本运行 return: 函数返回 export: 将变量导出到shell,使之成为shell的环境变量 set: 为shell设置参数变量 unset: 从环境中删除变量或函数 trap: 指定在收到操作系统信号后执行的动作 “:”(冒号命令): 空命令 “.”(句点命令)或source: 在当前shell中执行命令 2、find命令 (1)形式:find [path] [options] [tests] [actions] Options Tests 可以用操作符进行组合测试 :!(-not); -a(-and); -o(-or) 可以用圆括号来强制测试和操作符的优先级,需要用到转义字符\ 例: find . \(-name "_*" -or -newer while2\) -type f –print -amin<n>、-anewer<file>、-atime<n> -cmin<n>、-cnewer<file>、-ctime<n> -empty、-gid<n> or -group<name>、-pid<n> -name<name>, -iname<name> -size<n单位>、-type<c> -ipath<p>, -path<p>路径名符合p的文件,ipath表示忽略大小写 actions 3、grep命令(用于在文件中查找字符串) (1)形式:grep [OPTIONS] PATTERN [FILES] (2)正则表达式:广泛用于Linux和许多其他编程语言中,基本原理都是一样的 注:上表中的括号需要使用转移字符’\’,如 grep –E [a-z]\{10\} words2.txt 4、捕获命令输出 (1)语法: $(command) `command` (2)例: #!/bin/sh echo “The current directory is $PWD” echo “The current directory is $(pwd)” exit 0 5、算数扩展 (1)expr命令(支持的operator包括) expr argument operator argument (2)$((…))扩展 例:x=$(($x+1)) 6、参数扩展 #!/bin/sh i=0 while [ “$i” –ne 10 ]; do touch “${i}_tmp” i=$(($i+1)) done exit 0 7、即时文档 在shell脚本中向一条命令传送输入数据 #!/bin/bash cat << !CATINPUT! Hello, this is a here document. !CATINPUT! 8、shell脚本调试 *sbin/service: 它本身是一个shell脚本程序,作用就是获取传递给它的两个参数:$1 $2,分别是服务名和对该服务的动作。然后调用 /etc/rc.d/init.d/服务名称($1),并给该服务脚本传递你指定的动作($2)。 例如:service httpd stop 本身就是执行:/etc/rc.d/init.d/httpd stop。由httpd脚本去控制httpd服务的停止动作(stop)。 文件系统 1、 文件系统定义 1、基本定义 文件:一个可以被读写的对象。文件有一定的属性,包括访问权限和类型 文件系统:文件和其某一些属性的集合。它为指向文件的序列号提供了一个名空间文件系统由三部分组成:与文件管理有关软件、被管理文件以及实施文件管理所需数据结构。 文件类型:regular file、character special file、block special file、fifo、socket、symbolic link、directory(普通文件、特殊字符文件、块文件、命名管道、套接字、符号连接、目录) 文件结构:Byte stream; no particular internal structure(字节流、无特殊内部构造的文件) *ls –l命令 2、文件系统层次结构 3、文件系统的多种含义: (1)一种特定的文件格式(Ext2、FAT16、NTFS、FAT32) (2)指按照特定格式“格式化”的一块存储介质(“安装”、“卸载”一个文件系统) (3)指操作系统中(通常指在内核中)用来管理文件系统以及对文件进行操作的机制及其实现 4、创建一个文件系统 (1)创建一个文件:dd if=/dev/zero of=/work/file.img bs=1k count=10000 (2)用作块设备: losetup /dev/loop0 /work/file.img mke2fs –c /dev/loop0 10000 mkdir /mnt/testfs mount –t e2fs /dev/loop0 /mnt/testfs 5、Linux中的文件系统(VFS:Virtual File system Switch) (1)每个进程通过“打开文件”(open())与具体的文件建立起连接,或者说建立起一个读写的上下文。这种连接以一个file数据结构为代表,结构中有个file_operations结构指针f_op。 (2)将file结构中的指针f_op设置成指向某个具体的file_operations结构变量,就指定了这个文件所属的文件系统,并与具体文件系统所提供的一组函数挂上了钩 VFS模型是虚拟的,只在内存中出现,包含如下组成:super block、i-node object、file object、dentry object (1)超级块(superblock,了解数据结构): s_list:指向超级块链表的指针 *s_type:文件系统类型 *s_op:超级块方法 s_instances:该类型文件系统 (2)索引节点(inode,了解数据结构): *i_op:索引节点操作表 *i_fop:该索引节点对应文件的文件操作集 *i_sb:相关的超级块 (3)目录(dentry,了解数据结构) 目录项对象,一个路径的各个组成部分,不管是目录还是文件,都是一个dentry对象 *d_inode:相关的索引节点 *d_parent:父目录的目录项对象 d_name:目录项的名字 d_subdirs:子目录 *d_op:目录项操作表 *d_sb:文件超级块 目录项布局:目录项内容包括索引节点编号, 目录项名称长度以及名称本身。 (4)文件(file) 已打开的文件在内存中的表示: 6、进程和文件系统 7、Ext2文件系统 (1)GDT(group descriptor table) 每个块组信息,例如inode表起始位置;数据区起始位置,所有这些块组描述符构成GDT;每个group中都有一份GDT,以做备份 (2)Block bitmap: 块位图 描述block group中每个block是否被使用;本身占据一个block,每个block占据一个bit,假设block大小是1024 byte;那么总共可以描述:1024*8=8192 个block信息,1:表示已占用;0表示未占用 (3)Inode bitmap (4)Inode table 块组中所有的inode构成inode表,每个inode对应一个物理文件;Inode table的空间大小在格式化时候决定;Mke2fs默认块组有多少个8KB,就分配多少个inode (5)data block 对于常规文件,文件的数据存储在数据块中 目录文件:该目录下所有的文件名和目录名存储在数据块中 符号链接:如果目标路径名较短则直接保存在inode中以便更快地查找,如果目标路径名较长则分配一个数据块来保存 设备文件:fifo,socket文件等没有数据块,设备文件的major ,minor number保存在inode中 * 目录:一种特殊文件, 其文件内容是该目录中的目录项 8、Hard Link、Soft Link (1)Hard link 不同的文件名对应同一个inode 不能跨越文件系统 对应系统调用link (2)Symbolic link 存储被链接文件的文件名(而不是inode)实现链接 可跨越文件系统 对应系统调用symlink 9、数据块寻址 (1)Inode->block[15]数组 (2)Block[12-14]:间接索引 Block[12]:b/4 Block[13]:b/4*b/4 Block[14]:b/4*b/4*b/4 2、系统调用和库函数 1、比较: 相同点:都以C函数的形式出现 不同点: 系统调用:Linux内核的对外接口; 用户程序和内核之间唯一的接口; 提供最小接口 库函数:依赖于系统调用; 提供较复杂功能 2、可缓冲和非缓冲的I/O (1)Unbuffered I/O read/write ->System calls File descriptor 不在标准化C中,但是存在于POSIX.1和XPG3 (2)Buffered I/O 用标准I/O实现 处理很多细节, 如缓存分配, 以优化长度执行I/O等. Stream -> a pointer to FILE 3、基本I/O系统调用 1、文件描述符:无符号整数表示的句柄 在<unistd.h>中定义的:STDIN_FILENO (0), STDOUT_FILENO (1), STDERR_FILENO (2)‏ 打开文件操作基本流程:open-read/write-[lseek]-close 2、基本I/O操作 3、错误处理 (1)采用UNIX风格,返回错误代号”errno”,errno变量和错误代码都在头文件 /usr/include/errno.h 中定义 (2)strerror & perror char *strerror(int errnum); void perror(const char *msg); 4、open/creat函数(打开或者有可能创建一个文件) #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> 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); * creat(pathname, mode)等价于open(pathname, O_WRONLY|O_CREAT|O_TRUNC, mode)‏ 返回值:成功时返回文件的描述符,失败时返回-1 参数: (1)flags(除了O_RDONLY、O_WRONLY 、 O_RDWR以外的): O_APPEND:以追加方式打开 O_TRUNC::如果文件已经存在并且是一个普通文件且打开方式允许写操作,则文件长度被截0 O_CREAT:如果文件不存在则创建 O_EXCL:如果文件已经存在则错误返回 (2)mode:如果新文件被创建设置其属性 *umask机制:新创建文件的权限为:mode & ~umask 目录默认:777,文件默认:666 5、close函数 #include <unistd.h> int close(int fd); 返回值:成功则返回0,失败则返回1 6、read/write函数 #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 返回值: 读到的字节数,若已到文件尾为0,若出错为-1 ssize_t write(int fd, const void *buf, size_t count); 返回值: 若成功为已写的字节数,若出错为-1 7、lseek函数:定位文件中的读写位置 #include <sys/types.h> #include <unistd.h> off_t lseek(int fildes, off_t offset, int whence); 返回值:如果成功则返回地址的偏移量,失败则返回-1 参数whence: SEEK_SET: 从文件开头计算偏移量 SEEK_CUR: 从文件当前的位置开始计算偏移量 SEEK_END: 从文件结尾的位置开始计算偏移量 8、dup/dup2函数:复制文件描述符 *文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。 dup返回新的文件文件描述符(没有用的文件描述符最小的编号)。 dup2可以让用户指定返回的文件描述符的值,如果需要,则首先接近newfd的值,他通常用来重新打开或者重定向一个文件描述符。 #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd); 返回值:成功则返回文件新的描述符,失败则返回-1 9、文件共享与原子操作 不同进程间共享打开文件:进程表项-文件表-i节点表 10、fcntl函数:对指定的描述符对应的文件进行操作 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock *lock); 返回值: 若成功则依赖于cmd,若出错为-1 F_DUPFD: 用来查找大于或等于参数arg的最小且仍未使用的文件描述词,并且复制参数fd的文件描述词。 F_GETFD/F_SETFD: 取得/设置close-on-exec旗标。 F_GETFL/F_SETFL: 取得/设置文件描述词状态旗标 F_GETOWN/F_SETOWN: 管理可用的I/O信号 F_GETLK/F_SETLK/F_SETLKW: 取得/设置文件锁定的状态,后者若连接断开则直接错误返回 11、ioctl函数:控制设备,提供了一种获得设备信息和向设备发送控制参数的手段。 #include <sys/ioctl.h> int ioctl(int d, int request, ...); 4、标准I/O库 1、文件流 (1)结构: Stream and “FILE” structure FILE* fp; Predefined pointer: stdin, stdout, stderr (2)可缓冲的I/O 三种缓冲方式:全缓冲、行缓冲、不缓冲 2、open/close函数: #include <stdio.h> FILE *fopen(const char *filename, const char *mode); int fclose(FILE *stream); 参数: Mode:“r”(只读)、“w”(覆盖原有内容)、“a”(追加写)、“r+”(可读写)、 “w+”(可读写、如果不存在则创建,已有内容则覆盖)、“a+”(可读可追加,如果不存在则创建) 3、close函数 #include <stdio.h> int fclose(FILE *fp); 返回值:成功返回0,失败返回-1 3、字符输入:从流中读取一个字符,作为从无符号char转换成int返回,如果到末尾返回EOF #include <stdio.h> int getc(FILE *fp); int fgetc(FILE *fp); int getchar(void); *ungetchar将字符送回流中 4、字符输出: #include <stdio.h> int putc(int c, FILE *fp); int fputc(int c, FILE *fp); int putchar(int c); 5、一行字符串输入:fgets, gets functions,读取最多size-1个字符,存入s中(s最后一个字符为’\0’),遇到EOF则停止读取) #include <stdio.h> char *fgets(char *s, int size, FILE *stream); char *gets(char *s); //not recommended. 6、一行字符串的输出:fputs, puts functions #include <stdio.h> int fputs(const char *s, FILE *stream); int puts(const char *s); 7、二进制流输入/输出 #include <stdio.h> size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); 8、格式化I/O (1)scanf, fscanf, sscanf functions 不推荐,使用fgets(),然后解析字符串 #include <stdio.h> int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *str, const char *format, ...); (2)printf, fprintf, sprintf functions #include <stdio.h> int printf(const char *format, ...); int fprintf(FILE *stream, const char *format, ...); int sprintf(char *str, const char *format, ...); 9、流的重定位: (1)fseek, ftell, rewind functions #include <stdio.h> int fseek(FILE *stream, long int offset, int whence); long ftell(FILE *stream); void rewind(FILE *stream); (2)fgetpos, fsetpos functions ( Introduced in ANSI C)‏ #include <stdio.h> int fgetpos(FILE *fp, fpos_t *pos); int fsetpos(FILE *fp, const fpos_t *pos); 10、fflush()函数:刷新文件流。把流里的数据立刻写入文件 #include <stdio.h> int fflush(FILE *stream); 11、流缓冲操作 #include <stdio.h> void setbuf(FILE *stream, char *buf); int setvbuf(FILE *stream, char *buf, int mode, size_t size); 12、流描述符操作 (1)确定流使用的底层文件描述符 #include <stdio.h> int fileno(FILE *fp); (2)根据已打开的文件描述符创建一个流 #include <stdio.h> FILE *fdopen(int fildes, const char *mode); 13、临时文件 (1)为临时文件创建名字 #include <stdio.h> char *tmpnam(char *s); 返回值: 指向唯一路径名的指针 (2)创建一个临时文件 #include <stdio.h> FILE *tmpfile(void); 返回值: 若成功为文件指针,若出错为NULL 5、UNIX标准化 ISO C:提供C程序的可移植性,在不同的操作系统上运行,不只是UNIX系统 POSIX(Portable operating system interface):操作系统接口;UNIX系统间应用程序的可移植性 SUS(Single UNIX specification):扩展了POSIX接口 1、标准化实现: POSIX.1:SVR4、4.4BSD、FreeBSD、Linux、MAC OS X SUS:Solaris 2、UNIX限制 (1)编译时限制:短整型的最大值是多少、在头文件中定义、ISO C limits 定义(limits.h stdio.h…) (2)运行时限制:文件名长度最大是多少、POSIX限制、SUS 限制 3、运行时确定 <limits.h>中不一定定义所有值 4、I/O效率问题 随着BufferSize的增长,时间开始时快速下降,BufferSize到达某一值时,时间趋向平稳 6、文件共享 1、文件与进程的关系 (1)不同的进程可以打开同一个文件 (2)打开的文件在内核的表示:fd、file、vnode/inode 2、几点注意的地方 write对offset的影响、O_APPEND模式对offset的影响、lseek对offset影响 3、文件共享中的flags (1)fd flags fcntl(fd, F_GETFD/F_SETFD,arg) (2)file flags fcnt(fd, F_GETFL/F_SETFL,arg) (3)file share 多进程共享写操作会发生什么情况?——lseek,write--------O_APPEND 多进程共享创建文件会发生什么?——open,create-------O_EXCL 4、Linux文件缓存机制 7、高级系统调用 1、stat/fstat/lstat 函数:获取文件状态 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(const char *file_name, struct stat *buf); int fstat(int filedes, struct stat *buf); int lstat(const char *file_name, struct stat *buf); 返回值:成功则返回0,失败则返回-1 *stat数据结构了解 2、文件类型的宏定义 <sys/stat.h> 3、文件权限(Linux中文件的权限可以用4个8进制表示) S G T R W X R W X R W X chmod 777 ~/test/perm.test ls –l /usr/bin/passwd: -rwsr-xr-x st_mode & S_IRUSR 4、粘滞位(只对目录有效) (1)粘住位本来是针对可执行的程序文件,S_ISVTX (saved_text bit, 保存正文位) (2)现今的系统扩展了粘住位的使用范围,Single UNIX Specification允许针对目录设置粘住位。 (3)如果对一个目录设置了粘住位,则只有对该目录有写权限的用户在满足下列条件之一的情况下,才能删除或更名该目录下的文件: 拥有此文件、拥有此目录、是超级用户。 (4)目录/tmp和/var/spool/uucppublic是典型的设置粘住位的目录。任何用户都可以在这两个目录中创建文件,任一用户(用户、组或其他)对这两个目录的权限通常都是读、写和执行,但用户不能删除或更名其他人的文件。为此,在这两个目录的文件模式中都设置了粘住位。 5、euid, guid:进程访问资源的依据 SUID的功能是改变进程的euid SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid 6、access函数:按实际用户ID和实际组ID测试文件存取权限 #include <unistd.h> int access(const char *pathname, int mode); 7、umask
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服