1. 程式人生 > >[Linux系統程式設計]簡化版chmod命令實現

[Linux系統程式設計]簡化版chmod命令實現

簡化版chmod命令

標籤(空格分隔): Linux

—使用系統呼叫例項

在實現之前首先說一下#include<

一個簡單的系統程式設計:

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
int main(int argc, char **argv)
{
    int mode;//許可權
    int mode_u;
    int mode_g;
    int mode_o;
    char *path;

    //檢查引數個數的合理性
if(argc < 3) { printf("%s <mode num> <target file>"); exit(0); } //獲取命令列引數 mode = atoi(argv[1]); if(mode>777 && mode<0) { printf("wrong mode"); exit(1); } //mode轉換為8進位制 mode_u = mode / 100; mode_g = (mode - mode_u*100
)/10; mode_o = mode - mode_u*100 - mode*10; mode = mode_u*8*8 + mode_g*8 + mode_o; //呼叫chmod()函式 path = argv[2]; if(chmod(path,mode)==-1) { perror("chmod error"); exit(1); } return 0; }

簡化版chomd指令實施步驟:
1.檢查引數個數的合法性
2.獲取命令列引數
注:atoi()屬標準函式庫 將字串轉化為整數
http://www.runoob.com/cprogramming/c-function-atoi.html


exit(0) 表示程式正常退出,exit⑴/exit(-1)表示程式異常退出。
3.將mode轉化為8進位制
4.系統呼叫呼叫chmod()函式
chmod(file,mode)
chmod() 函式改變指定檔案的許可權。
如果成功則返回 TRUE,如果失敗則返回 FALSE。

https://img-blog.csdn.net/20180724212108678?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tra2tkZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

mode模式位:

mode 表示新目錄的許可權,可以取以下值:

S_IRUSR
S_IREAD

S_IWUSR
S_IWRITE
S_IXUSR
S_IEXEC
S_IRWXU
This is equivalent to (S_IRUSR | S_IWUSR | S_IXUSR).
S_IRGRP
Read permission bit for the group owner of the file. Usually 040.
S_IWGRP
Write permission bit for the group owner of the file. Usually 020.
S_IXGRP
Execute or search permission bit for the group owner of the file. Usually 010.
S_IRWXG
This is equivalent to (S_IRGRP | S_IWGRP | S_IXGRP).
S_IROTH
Read permission bit for other users. Usually 04.
S_IWOTH
Write permission bit for other users. Usually 02.
S_IXOTH
Execute or search permission bit for other users. Usually 01.
S_IRWXO
This is equivalent to (S_IROTH | S_IWOTH | S_IXOTH).
S_ISUID
This is the set-user-ID on execute bit, usually 04000. See How Change Persona.
S_ISGID
This is the set-group-ID on execute bit, usually 02000. See How Change Persona.
S_ISVTX
This is the sticky bit, usually 01000.

S_IRWXU 00700許可權,代表該檔案所有者擁有讀,寫和執行操作的許可權
S_IRUSR(S_IREAD) 00400許可權,代表該檔案所有者擁有可讀的許可權
S_IWUSR(S_IWRITE) 00200許可權,代表該檔案所有者擁有可寫的許可權
S_IXUSR(S_IEXEC) 00100許可權,代表該檔案所有者擁有執行的許可權
S_IRWXG 00070許可權,代表該檔案使用者組擁有讀,寫和執行操作的許可權
S_IRGRP 00040許可權,代表該檔案使用者組擁有可讀的許可權
S_IWGRP 00020許可權,代表該檔案使用者組擁有可寫的許可權
S_IXGRP 00010許可權,代表該檔案使用者組擁有執行的許可權
S_IRWXO 00007許可權,代表其他使用者擁有讀,寫和執行操作的許可權
S_IROTH 00004許可權,代表其他使用者擁有可讀的許可權
S_IWOTH 00002許可權,代表其他使用者擁有可寫的許可權
S_IXOTH 00001許可權,代表其他使用者擁有執行的許可權
例子:

#include