리눅스
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;
}