如何理解 Linux 权限系统
最近一直在处理服务器上的 issue,中间遇到最多的的就是 Permission denied 问题,这就是权限问题。今天就来整理一下 Linux 文件权限系统的知识,从根本上填掉这个坑。
Linux 文件权限Linux 中,目录和文件都被视为文件。Linux 中每个文件都有其属性与权限。我们可以使用 ls 命令来查看
1$ ls -al
可以看到,每个文件的最前面都有一个文件类型和权限描述。后面分别是文件链接数,文件拥有者,文件用户组,文件最后修改日期和名称。. 代表当前目录 .. 代表上一级目录。
第一栏: 文件类型和权限123456789101112 maywzh@M-Ubuntu /bin ls -altotal 13412drwxr-xr-x 2 root root 4096 Sep 24 19:19 .drwxr-xr-x 24 root root 4096 Oct 4 06:12 ..-rwxr-xr-x 1 root root 1113504 Apr 5 02:30 bash-rwxr-xr-x 1 root root 748968 A ...
Mysql 的常用命令
总结一下常用的简单 MySQL 命令。
MySQL 介绍MySQL 为关系型数据库由一个或数个表格组成
id
name
sex
age
0
张三
m
23
1
李四
f
35
2
王五
m
20
…
…
…
…
表头 (header): 每一列的名称; 列 (col): 每一列用来描述表中所有数据项的某个属性; 行 (row): 每一行用来描述某个数据项的的所有属性; 值 (value): 行的具体信息,每个值必须与该列的数据类型相同;
登录 MySQL12345mysql -h 127.0.0.1 -u username -pmysql -D dbname -h hostname -u username -pmysql> exit # 退出 mysql> quit # 退出
创建数据库对于表的操作需要先进入库 use 库名;
1234567create database testdb character set gbk; -- 创建一个名为 testdb 的数据库,数据库字符编码指定为 gbkdrop database testd ...
Linux 静态库编译指南
Linux 上的静态库,其实是目标文件的归档文件。在 Linux 上创建静态库的步骤如下:
写源文件,通过 gcc -c xxx.c 生成目标文件。
用 ar 归档目标文件,生成静态库。
配合静态库,写一个使用静态库中函数的头文件。
使用静态库时,在源码中包含对应的头文件,链接时记得链接自己的库。
源文件print.c 和 math.c
1234567//print.c#include <stdio.h>void cout(const char * message){ fprintf(stdout, "% s\n", message);}
12345678910//math.cint add(int a, int b){ return a + b;}int subtract(int a, int b){ return a - b;}
生成目标文件
123$ gcc -c print.c math.c$ lsmath.c math.o print.c print.o
归档 ...
Linux 中的重定向
从一个命令说起经常能从 shell 脚本中看到类似这样的命令
1$ cmd >/dev/null 2>&1 #cmd 代表一个可以输出结果的命令
重定向在使用 shell 命令的时候,最常见的是键盘输入命令,终端显示处理结果。有的时候需要将 shell 命令的执行结果存储到文件中,或者让 shell 读取某个文件的内容作为输入,那么就需要使用输入输出的重定向功能。
重定向就是指把程序的输入源或者输出地址修改为我们制定的 IO 设备或文件。当打开 shell 命令是,会默认打开 3 个文件。每个文件都有对应的文件描述符方便我们使用。
类型
文件描述符
默认情况
对应文件句柄位置
标准输入(standard input)
0
从键盘获得输入
/proc/slef/fd/0
标准输出(standard output)
1
输出到屏幕(即控制台)
/proc/slef/fd/1
错误输出(error output)
2
输出到屏幕(即控制台)
/proc/slef/fd/2
在这里,根据 Linux 一切皆文件的思想,把输入输出设备都视为 ...
理解 C 语言中的指针
在考虑指针的问题之前,首先我们来回顾一下如何定义一个变量。
1int x;
int 类型需要四个字节来存储,这四个字节是从内存中分配而来的,内存在逻辑上是一个线性的存储器,它以字节为单位被划分为许多小的单元。为了区分这些单元,计算机给每一个单元都分配了一个唯一的十六进制整数作为编号,叫做内存地址 (简称地址)。由于这些单元啊数量众多,所以这个内存地址本身就需要四个字节 (32 位 bit 位) 来表示。我们所说的 32 位系统就是这个意思。它最大的可寻址范围为 2^32 字节,即 4GB。目前正在占据主流的 64 位系统的最大可寻址范围是 2^64 字节。
理论上说,我们只需要这些内存地址就可以定位到我们所要读写的内存单元,但这些地址不方便理解和记忆,c 语言允许程序员给这些地址起名字,就是我们所说的变量名。
回到 int x 这个声明,它实际上做了两件事:
从内存中划分出 4 个字节;
将这个内存单元约定一个名字为 x;
一个固定的内存单元的地址是固定的,但存储的值确是可变的。
指针概念获取变量的地址由于有变量名的存在,我们不需要一个具体地址就可以操作它来进行各种运算,但有的时 ...
一些 C/C++ 输入输出的问题
总结 C/C++ 的 IO 的一些问题。
cin 的 “>>” 函数返回值是什么?
为什么用 while (cin>>a) 一直跳不出循环?
1234int a;while (cin >> a){ }
>> 是一个被重载过的运算符,它本质上是调用函数 operator>>(cin),这个重载函数的返回值类型为 istream&,返回值通常就是输入流 cin 本身,cin 是定义在 std 空间中的标准输入流变量。如果没有遇到错误输入或者文件末尾(EOF),cin 就一直有效,当然就跳不出 while 循环。当你在键盘上输入 Ctrl+Z,再按 Enter 键,就等同于输入遇到了文件末尾 EOF,遇到 EOF 后,>> 函数的返回值是 0,就能结束 while 循环了。
scanf 的返回值是什么?
while (scanf ("% d % d",&a,&b)){ } 为何是死循环?遇到文件结束符 EOF 也跳不出循环?
s ...