4.1.3.2/3 linux文件管理 :文件权限操作 :数字、字符方式修改权限

本文深入讲解Linux系统中文件权限的管理,包括数字和字符方式修改权限的方法,如使用chmod命令进行777权限设置,以及如何针对不同用户群体进行精确权限分配。适合Linux初学者及系统管理员参考。

4.1.3.2/3 linux文件管理 :文件权限操作 :数字、字符方式修改权限

常用命令

$chmod 777 <fileName>
$chmod 777 -R <fileName> ##递归
$chmod u+x,g+x,o+x -R <fileName> 

数字方式修改权限
一共三个权限,拥有者权限,所属组权限 , 其他用户权限
7 7 7是所有权限:拥有者权限 :7 ,所属组权限 :7, 其他用户权限 :7

chmod [-+=][0-7]+ <fileName>
设置所有的权限
$ chmod 777  <fileName> ##设置指定文件三类拥有者只有rwx权限

字符方式修改权限

chmod [ugoa]*([-+=]([rwxXst]*|[ugo]))+ <fileName>

设置所有的权限

$ chmod a=w <fileName> ##设置指定文件三类拥有者只有write权限
$ chmod a+w <fileName> ##追加指定文件三类拥有者write权限
$ chmod u=w,g=r,o=r <fileName> ##分别指定三类拥有者各自的权限
$ chmod +u,+g <fileName> ##设置指定文件拥有user和group的权限

举例

chmod +u,+g <fileName>
$ ls -l code.txt 
-rw-rw-rw- 1 sgx sgx 0 Oct 27 12:36 code.txt
$ chmod u+x code.txt 
$ ls -l code.txt 
-rwxrw-rw- 1 sgx sgx 0 Oct 27 12:36 code.txt
$ chmod +u code.txt ##追加g和o和u的权限一致
$ ls -l code.txt 
-rwxrwxrwx 1 sgx sgx 0 Oct 27 12:36 code.txt ##g和o拥有了user的所有权限

命令详解
chmod [ugoa]*(-+=)+

ugoa

u是指user,文件拥有者
g是指group,其它在文件的group里的用户
o是指other,其它不在文件的group里的用户
a是指all,即所有用户

[rwxXst]*|[ugo]

r:read
w:write
x:可执行,可查找(对于目录)
X:只有当文件是一个目录或者已经对某用户可执行,这个文件才能可执行或可查找
t:删除文件
[ugo]: 例如chmod +u a.sh,那么a.sh就有了user用户应该有的permission

[-+=]

+ 添加操作权限
- 删除操作权限
= 指定操作权限
     但不是所有的bit都会被删,except that a directory’s unmentioned set user and group ID bits are not affected.
如果相对不同的用户设置不同的permission,可以用逗号隔开,这样a+r,u+w

option格式

-c,–changes       ##每次改变file mode bits时显示改变操作
-f, –silent,–quiet##抑制大多数错误信息的显示
-v,–verbose       ##输出文件信息
–reference=RFILE  ##采用RFILE的mode
-R, –recursive    ##递归地改变mode
程序崩溃或段错误(Segmentation Fault)是常见的运行时问题,通常由于非法访问内存导致。您提到的 `segmentation fault core_handler sigevent.c:262 raise libc.so.6` 是 Linux 系统中发生的典型段错误信息,涉及 glibc 库中的信号处理机制。 ### 1. 段错误的基本原理 段错误发生在程序试图访问其没有权限访问的内存区域时。操作系统会发送 `SIGSEGV` 信号给进程,如果未正确处理该信号,则会导致程序终止并生成核心转储文件(core dump)。在日志中看到的 `raise()` 调用堆栈表明,glibc 正在尝试触发信号处理流程,但最终未能恢复,导致崩溃发生[^1]。 ### 2. 日志分析:`sigevent.c:262` 和 `libc.so.6` - **`sigevent.c`** 是 glibc 中用于处理异步信号事件的源文件之一。 - **`raise()` 函数** 是标准 C 库中用于向当前线程发送信号的函数。 - 当程序因非法内存访问而收到 `SIGSEGV` 信号后,glibc 会调用 `raise()` 来通知用户空间的信号处理程序。 - 如果信号处理程序本身存在问题(如递归调用、堆栈溢出等),则可能导致程序进一步崩溃,并记录类似 `core_handler` 的日志信息[^1]。 ### 3. 常见原因与排查方法 #### 3.1 非法指针访问 - 使用未初始化或已释放的指针。 - 解引用空指针或野指针。 - 访问数组越界。 ```c int *ptr = NULL; *ptr = 42; // 非法写入NULL指针,将引发SIGSEGV ``` #### 3.2 栈溢出 - 递归深度过大或局部变量占用过多栈空间。 - 使用不安全的字符操作函数(如 `strcpy()`)导致缓冲区溢出。 ```c void recurse(int n) { if (n == 0) return; int arr[1000]; // 每次递归分配大量栈内存 recurse(n - 1); } ``` #### 3.3 多线程竞争条件 - 多个线程同时访问共享资源而未加锁。 - 线程提前退出但仍有其他线程尝试访问其资源。 ```c pthread_t thread; void* thread_func(void* arg) { int local = 42; return &local; // 返回局部变量地址,主线程访问将导致UB } // 主线程 pthread_join(thread, &result); printf("%d\n", *(int*)result); // 可能引发段错误 ``` ### 4. 调试工具推荐 #### 4.1 `gdb`(GNU Debugger) 使用 `gdb` 可以加载 core dump 文件,查看崩溃时的调用栈和寄存器状态: ```bash gdb ./your_program core (gdb) bt ``` #### 4.2 `valgrind` / `memcheck` `valgrind` 的 `memcheck` 工具可以检测内存访问错误、泄漏等问题: ```bash valgrind --tool=memcheck ./your_program ``` #### 4.3 AddressSanitizer(ASan) AddressSanitizer 是一种高效的内存错误检测工具,集成在 GCC 和 Clang 中: ```bash gcc -fsanitize=address -g your_program.c -o your_program ./your_program ``` ### 5. 如何防止段错误 - 使用智能指针(C++)或自动内存管理机制。 - 避免手动管理内存,优先使用容器类(如 `std::vector`, `std::string`)。 - 启用编译器警告和静态检查工具(如 `-Wall -Wextra`, `clang-tidy`)。 - 对关键函数进行单元测试,覆盖边界情况。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值