리눅스

sol3

정지홍 2023. 4. 11. 13:50

1번

//파일의 정보를 추출하는 프로그램
//알고 싶은 파일의 이름은 명령행인자로 받는다.
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc , char *argv[]){
   
    if(argc!=2){
        printf("wrong!\n");
        exit(1);
    }

    struct stat buf;
    stat(argv[1],&buf);
   

    printf("File name : %s\n",argv[1]);
    printf("InodeNum : %d\n", (unsigned int)buf.st_mode);
    printf("KindOfFile : ");
    int kind;
    kind=buf.st_mode&S_IFMT;
    switch(kind){
        case S_IFIFO:
        printf("FIFO\n");break;
        case S_IFDIR:
        printf("Dir\n");break;
        case S_IFREG:
        printf("regular file\n");break;
    }
    printf("AccessAuthority : %o\n",(unsigned int)buf.st_mode);
    printf("UserId : %d\n",(int)buf.st_uid);
    printf("Time : %d\n",(int)buf.st_ctime);

    return 0;
   

}

2번

//입력받은 파일의 접근 권한 출력
//그리고 접근 권한을 변경하는 프로그램
//문자 모드 기능 구현 ex) mychomd g+w a.c
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char *argv[]){
    
    if(argc !=3){
        printf("error!\n");
        exit(1);
    }

    struct stat buf;
    stat(argv[2],&buf);

    printf("Mode = %o\n",(unsigned int)buf.st_mode);

    if(strcmp(argv[1],"g+w")==0){
        printf("test\n");
        buf.st_mode |= S_IWGRP;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }


    if(strcmp(argv[1],"g-w")==0){
        printf("test\n");
        buf.st_mode &= S_IWGRP;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }

    if(strcmp(argv[1],"u+w")==0){
        printf("test\n");
        buf.st_mode |= S_IWUSR;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }


    if(strcmp(argv[1],"u-w")==0){
        printf("test\n");
        buf.st_mode &= S_IWUSR;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }
    
    if(strcmp(argv[1],"o+w")==0){
        printf("test\n");
        buf.st_mode |= S_IWOTH;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }


    if(strcmp(argv[1],"o-w")==0){
        printf("test\n");
        buf.st_mode &= S_IWOTH;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }
    
    
    
    if(strcmp(argv[1],"g+r")==0){
        printf("test\n");
        buf.st_mode |= S_IRGRP;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }


    if(strcmp(argv[1],"g-r")==0){
        printf("test\n");
        buf.st_mode &= S_IRGRP;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }

    if(strcmp(argv[1],"u+r")==0){
        printf("test\n");
        buf.st_mode |= S_IRUSR;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }


    if(strcmp(argv[1],"u-r")==0){
        printf("test\n");
        buf.st_mode &= S_IRUSR;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }
    
    if(strcmp(argv[1],"o+r")==0){
        printf("test\n");
        buf.st_mode |= S_IROTH;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }


    if(strcmp(argv[1],"o-r")==0){
        printf("test\n");
        buf.st_mode &= S_IROTH;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }




   
    
    if(strcmp(argv[1],"g+x")==0){
        printf("test\n");
        buf.st_mode |= S_IXGRP;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }


    if(strcmp(argv[1],"g-x")==0){
        printf("test\n");
        buf.st_mode &= S_IXGRP;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }

    if(strcmp(argv[1],"u+x")==0){
        printf("test\n");
        buf.st_mode |= S_IXUSR;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }


    if(strcmp(argv[1],"u-x")==0){
        printf("test\n");
        buf.st_mode &= S_IXUSR;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }
    
    if(strcmp(argv[1],"o+x")==0){
        printf("test\n");
        buf.st_mode |= S_IXOTH;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }


    if(strcmp(argv[1],"o-x")==0){
        printf("test\n");
        buf.st_mode &= S_IXOTH;
        chmod(argv[2],buf.st_mode);
        stat(argv[2],&buf);
        printf("Mode = %o\n",(unsigned int)buf.st_mode);
    }

    return 0;
}

3번

//입력받은 파일의 접근 권한 출력
//접근 권한 변경하는데 숫자 모드로
//mychmod 0777 a.c
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc , char *argv[]){
    if(argc != 3){
        printf("error!\n");
        exit(1);
    }
    struct stat buf;
    stat(argv[2],&buf);
    int u,g,o;
    int x=atoi(argv[1]);
    o=x%10;
    x=x/10;
    g=x%10;
    x=x/10;
    u=x%10;

    printf("mode = %o\n",(unsigned int)buf.st_mode);
    //모두 지운다.

    buf.st_mode &= (00000);
    chmod(argv[2],buf.st_mode);
    stat(argv[2],&buf);
printf("mode = %o\n",(unsigned int)buf.st_mode);
    switch(u){

        case 7:
            buf.st_mode |= (S_IRWXU);
            chmod(argv[2],buf.st_mode);
            stat(argv[2],&buf);
            break;

        case 6:
            buf.st_mode |= (S_IRUSR);
            buf.st_mode |= (S_IWUSR);
            chmod(argv[2],buf.st_mode);
            stat(argv[2],&buf);
            break;

        case 4:
            buf.st_mode |= (S_IRUSR);
            chmod(argv[2],buf.st_mode);
            stat(argv[2],&buf);
            break;

        case 2:
            buf.st_mode |= (S_IWUSR);
            chmod(argv[2],buf.st_mode);
            stat(argv[2],&buf);
            break;

        case 1:
            buf.st_mode |=(S_IXUSR);
            chmod(argv[2],buf.st_mode);
            stat(argv[2],&buf);
            break;

        case 0:
            break;
    }

    switch(g){

        case 7:
            buf.st_mode |= (S_IRWXG);
            chmod(argv[2],buf.st_mode);
            stat(argv[2],&buf);
            break;

        case 6:
            buf.st_mode |= (S_IRGRP);
            buf.st_mode |= (S_IWGRP);
            chmod(argv[2],buf.st_mode);
            stat(argv[2],&buf);
            break;

        case 4:
            buf.st_mode |= (S_IRGRP);
            chmod(argv[2],buf.st_mode);
            stat(argv[2],&buf);
            break;

        case 2:
            buf.st_mode |= (S_IWGRP);
            chmod(argv[2],buf.st_mode);
            stat(argv[2],&buf);
            break;

        case 1:
            buf.st_mode |=(S_IXGRP);
            chmod(argv[2],buf.st_mode);
            stat(argv[2],&buf);
            break;

        case 0:
            break;
    }


    switch(o){

        case 7:
            buf.st_mode |= (S_IRWXO);
            chmod(argv[2],buf.st_mode);
            stat(argv[2],&buf);
            break;

        case 6:
            buf.st_mode |= (S_IROTH);
            buf.st_mode |= (S_IWOTH);
            chmod(argv[2],buf.st_mode);
            stat(argv[2],&buf);
            break;

        case 4:
            buf.st_mode |= (S_IROTH);
            chmod(argv[2],buf.st_mode);
            stat(argv[2],&buf);
            break;

        case 2:
            buf.st_mode |= (S_IWOTH);
            chmod(argv[2],buf.st_mode);
            stat(argv[2],&buf);
            break;

        case 1:
            buf.st_mode |=(S_IXOTH);
            chmod(argv[2],buf.st_mode);
            stat(argv[2],&buf);
            break;

        case 0:
            break;
    }

  printf("mode = %o\n",(unsigned int)buf.st_mode);
    return 0;
}

4번

//해당 디렉토리가 비어있는지 확인후 메시지 출력
//만약 비어있으면 해당 dir 삭제
//myRmdir a.c
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc , char *argv[]){

    if(argc!=2){
        printf("Error!\n");
        exit(1);
    }

    DIR *dp;
    struct dirent *dent;
    int cnt=0;

    if ( (dp=opendir(argv[1]))==NULL){
        perror("openDir : ");
        exit(1);
    }

    while( (dent=readdir(dp))){
        if(dent->d_name[0]=='.')continue;
        else
            cnt+=1;
    }

    if (cnt==0){
        printf("emptyDir!\n");
        if((rmdir(argv[1])==-1)){
            perror("error!");
            exit(1);
        }
        else    
            printf("delete Dir!\n");
    }
    else
        printf("not empty!\n");



    return 0;
}

 


5번

//디렉토리명을 명령행 인자로 입력받는다.
//그 이름으로 dir 생성한다.
//새로 만든 dir로 디렉토리를 이동하는 프로그램
//ex) myChDir test
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc , char *argv[]){
   
    if(argc!=2){
        printf("error!\n");
        exit(1);
    }

    DIR *dp;
    struct dirent *dent;
    struct stat buf;
    char *cwd;
    char wd[BUFSIZ];

//이동 경로 만드는 코드
    cwd=getcwd(NULL,BUFSIZ);
    strcat(cwd,"/");
    strcat(cwd,argv[1]);
    //printf("%s\n",cwd);


   
    if( mkdir(argv[1],0755)==-1){
        perror("mkdir : ");
        exit(1);
    }
   
   chdir(cwd);


    getcwd(wd,BUFSIZ);
    printf("%s\n",wd);




    return 0;

}

 


6번

//.과 ..을 제외한 디렉토리의 모든 내용을 출력
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(void){
    char *cwd;
    DIR *dp;
    struct dirent *dent;

    cwd=getcwd(NULL,BUFSIZ);

    if( (dp=opendir(cwd))==NULL){
        printf("opendir : ");
        exit(1);
    }

    while( (dent=readdir(dp)) ){
        if(dent->d_name[0]=='.'){
            continue;
        }
        else{
            printf("Name : %s\n",dent->d_name);
        }
    }


    return 0;
}

7번

//현재 디록토리의 파일을 지정한 디렉토리로 이동시키는 프로그램
//ex) mymv a.dat dir1
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc , char *argv[]){
    if(argc !=3){
        printf("error!\n");
        exit(1);
    }
    int rm;
    char *cwd;
    char *moveCwd;
    cwd=getcwd(NULL,BUFSIZ);
    moveCwd=getcwd(NULL , BUFSIZ);
    strcat(moveCwd,"/");
    strcat(moveCwd,argv[2]);
    strcat(moveCwd,"/");
    strcat(moveCwd,argv[1]);

    symlink(argv[1],moveCwd);
    rm=unlink(argv[1]);
    if(rm==-1){
        perror("unlink : ");
        exit(1);
    }

    return 0;
}

8번

 

//현재 디렉토리에 있는 내용을 파일인지 디렉토리인지 구별하는 프로그램
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(void){
    DIR *dp;
    struct dirent *dent;
    struct stat buf;
    
    if((dp=opendir("."))==NULL){
        perror("opendir : ");
        exit(1);
    }

    while((dent=readdir(dp))){
        if(dent->d_name[0]=='.')continue;
        stat(dent->d_name,&buf);

        if(S_ISDIR(buf.st_mode))printf("%s/\n",dent->d_name);
        else printf("%s\n",dent->d_name);

    }

    return 0;
}