详细对比C语言中的chmod()函数和fchmod()函数

C语言chmod()函数:修改文件权限
头文件:

#include <sys/types.h>  #include <sys/stat.h>

定义函数:

int chmod(const char * path, mode_t mode);

函数说明:chmod()会依参数mode 权限来更改参数path 指定文件的权限。

参数 mode 有下列数种组合:
1、S_ISUID 04000 文件的 (set user-id on execution)位
2、S_ISGID 02000 文件的 (set group-id on execution)位
3、S_ISVTX 01000 文件的sticky 位
4、S_IRUSR (S_IREAD) 00400 文件所有者具可读取权限
5、S_IWUSR (S_IWRITE)00200 文件所有者具可写入权限
6、S_IXUSR (S_IEXEC) 00100 文件所有者具可执行权限
7、S_IRGRP 00040 用户组具可读取权限
8、S_IWGRP 00020 用户组具可写入权限
9、S_IXGRP 00010 用户组具可执行权限
10、S_IROTH 00004 其他用户具可读取权限
11、S_IWOTH 00002 其他用户具可写入权限
12、S_IXOTH 00001 其他用户具可执行权限

注:只有该文件的所有者或有效用户识别码为0,才可以修改该文件权限。

基于系统安全,如果欲将数据写入一执行文件,而该执行文件具有S_ISUID 或S_ISGID 权限,则这两个位会被清除。如果一目录具有S_ISUID 位权限,表示在此目录下只有该文件的所有者或root 可以删除该文件。

返回值:权限改变成功返回0, 失败返回-1, 错误原因存于errno.

错误代码:
1、EPERM 进程的有效用户识别码与欲修改权限的文件拥有者不同, 而且也不具root 权限.
2、EACCESS 参数path 所指定的文件无法存取.
3、EROFS 欲写入权限的文件存在于只读文件系统内.
4、EFAULT 参数path 指针超出可存取内存空间.
5、EINVAL 参数mode 不正确
6、ENAMETOOLONG 参数path 太长
7、ENOENT 指定的文件不存在
8、ENOTDIR 参数path 路径并非一目录
9、ENOMEM 核心内存不足
10、ELOOP 参数path 有过多符号连接问题.
11、EIO I/O 存取错误

范例

/* 将/etc/passwd 文件权限设成S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH */
#include <sys/types.h>
#include <sys/stat.h>
main()
{
  chmod("/etc/passwd", S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
}

C语言fchmod()函数:修改文件的权限
头文件:

#include <sys/types.h>  #include <sys/stat.h>

定义函数:

int fchmod(int fildes, mode_t mode);

函数说明:fchmod()会依参数mode 权限来更改参数fildes 所指文件的权限。参数fildes 为已打开文件的文件描述词。参数mode 请参考chmod ()。

返回值:权限改变成功则返回0, 失败返回-1, 错误原因存于errno.

错误代码:
1、EBADF 参数fildes 为无效的文件描述词。
2、EPERM 进程的有效用户识别码与欲修改权限的文件所有者不同, 而且也不具root 权限。
3、EROFS 欲写入权限的文件存在于只读文件系统内。
4、EIO I/O 存取错误。

范例

#include <sys/stat.h>
#include <fcntl.h>
main()
{
  int fd;
  fd = open("/etc/passwd", O_RDONLY);
  fchmod(fd, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
  close(fd);
}
(0)

相关推荐

  • 详解C语言中telldir()函数和seekdir()函数的用法

    C语言telldir()函数:取得目录流的读取位置 头文件: #include <dirent.h> 定义函数: off_t telldir(DIR *dir); 函数说明:telldir()返回参数dir 目录流目前的读取位置. 此返回值代表距离目录文件开头的偏移量返回值返回下个读取位置, 有错误发生时返回-1. 错误代码:EBADF 参数dir 为无效的目录流. 范例 #include <sys/types.h> #include <dirent.h> #inclu

  • 对比C语言中execv相关的执行文件的三个函数

    C语言execv()函数:执行文件函数 头文件: #include <unistd.h> 定义函数: int execv (const char * path, char * const argv[]); 函数说明:execv()用来执行参数path 字符串所代表的文件路径, 与execl()不同的地方在于execve()只需两个参数, 第二个参数利用数组指针来传递给执行文件. 返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中. 错误代码:请参考 ex

  • 详解C语言中的wait()函数和waitpid()函数

    C语言wait()函数:结束(中断)进程函数(常用) 头文件: #include <sys/types.h> #include <sys/wait.h> 定义函数: pid_t wait (int * status); 函数说明:wait()会暂时停止目前进程的执行, 直到有信号来到或子进程结束. 如果在调用wait()时子进程已经结束, 则wait()会立即返回子进程结束状态值. 子进程的结束状态值会由参数status 返回, 而子进程的进程识别码也会一快返回. 如果不在意结束状

  • 详细对比C语言中的chmod()函数和fchmod()函数

    C语言chmod()函数:修改文件权限 头文件: #include <sys/types.h> #include <sys/stat.h> 定义函数: int chmod(const char * path, mode_t mode); 函数说明:chmod()会依参数mode 权限来更改参数path 指定文件的权限. 参数 mode 有下列数种组合: 1.S_ISUID 04000 文件的 (set user-id on execution)位 2.S_ISGID 02000 文

  • python语言中pandas字符串分割str.split()函数

    目录 前言 1.常规赛数据格式 2.计算詹姆斯常规赛命中率 总结 前言 为了介绍python语言中pandas库在数据分析中的重要作用,本人打算以NBA球星勒布朗詹姆斯在2020-2021赛季常规赛个人数据为例对pandas相关函数进行详细说明.利用爬虫技术,在知名篮球网站虎扑爬取了勒布朗詹姆斯的数据,稍后会将数据上传至csdn,以供大家下载. 这篇文章,详细介绍了pandas字符串分割函数---str.split()的用法. DataFrame.str.split(pa,n,expand)pa

  • C语言中“不受限制”的字符串函数总结

    "不受限制的"字符串函数 按<C和指针>中所说,那些常用的字符串函数都是"不是限制的",就是说它们只能通过寻找字符串末尾的NULL来判断字符串的长度. strlen strlen函数用于求解字符串长度,其返回类型为unsigned int(即size_t).strlen函数从起点开始,往后计数,遇到'\0'停止. 值得注意的是:strlen函数的返回类型.看如下代码: #include<string.h> #include<iostre

  • R语言中cbind、rbind和merge函数的使用与区别

    cbind: 根据列进行合并,即叠加所有列,m列的矩阵与n列的矩阵cbind()最后变成m+n列,合并前提:cbind(a, c)中矩阵a.c的行数必需相符 rbind: 根据行进行合并,就是行的叠加,m行的矩阵与n行的矩阵rbind()最后变成m+n行,合并前提:rbind(a, c)中矩阵a.c的列数必需相符 > a <- matrix(1:12, 3, 4) > print(a) [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,

  • 对比C语言中的setbuf()函数和setvbuf()函数的使用

    C语言setbuf()函数:把缓冲区与流相关联 头文件: #include <stdio.h> 函数setbuf()用于将指定缓冲区与特定的文件流相关联,实现操作缓冲区时直接操作文件流的功能.其原型如下: void setbuf(FILE * stream, char * buf); [参数]stream为文件流指针,buf为缓冲区的起始地址. 如果参数buf 为NULL 指针,则为无缓冲,setbuf()相当于调用setvbuf(stream, buf, buf ? _IOFBF : _IO

  • 简单对比C语言中的fputs()函数和fputc()函数

    C语言fputc()函数:写文件函数(将一指定字符写入文件流中) 头文件: #include <stdio.h> 定义函数: int fputc(int c, FILE * stream); 函数说明:fputc 会将参数c 转为unsigned char 后写入参数stream 指定的文件中. 返回值:fputc()会返回写入成功的字符, 即参数c. 若返回EOF 则代表写入失败. 范例 #include <stdio.h> main() { FILE * fp; char a[

  • 对比C语言中memccpy()函数和memcpy()函数的用法

    C语言memccpy()函数:复制内存中的内容 头文件: #include <string.h> 定义函数: void * memccpy(void *dest, const void * src, int c, size_t n); 函数说明:memccpy()用来拷贝src 所指的内存内容前n 个字节到dest 所指的地址上.与memcpy()不同的是,memccpy()会在复制时检查参数c 是否出现,若是则返回dest 中值为c 的下一个字节地址. 返回值:返回指向dest 中值为c 的

  • 对比C语言中getc()函数和ungetc()函数的使用

    C语言getc()函数:从流中读取字符 头文件: #include <stdio.h> 函数getc()用于从流中取字符,其原型如下: int getc(FILE *stream); [参数]参数*steam为要从中读取字符的文件流. [返回值]该函数执行成功后,将返回所读取的字符. [说明]若从一个文件中读取一个字符,读到文件尾而无数据时便返回EOF.getc()与fgetc()作用相同,但在某些库中getc()为宏定义,而非真正的函数. [实例]下面的示例演示了getc()函数的使用,在程

  • 简要对比C语言中的setgid()函数和setregid()函数

    C语言setgid()函数:设置真实的组识别码 头文件: #include <unistd.h> 定义函数: int setgid(gid_t gid); 函数说明:setgid()用来将目前进程的真实组识别码(real gid)设成参数gid 值. 如果是以超级用户身份执行此调用, 则real.effective 与savedgid 都会设成参数gid. 返回值:设置成功则返回0, 失败则返回-1, 错误代码存于errno 中. 错误代码: EPERM:并非以超级用户身份调用, 而且参数gi

随机推荐