See struct stat and fstat;
pretty simple example, and getMode show a good example in terms of bit operation.
#include <stdio.h> // 표준입출력헤더파일
#include
<stdlib.h>
#include
<sys/stat.h> // stat 구조체가선언되어있는헤더파일
#include
<sys/types.h> // perror 함수호출을위한헤더파일
#include
<unistd.h>
#include
<fcntl.h> // file
control flag가저장되어있는헤더파일
#define
MAX_BUF 64 // BUF 크기를정의한다.
char*
getMode(mode_t mode,char* bit); // getMode 함수는현재파일의속성을출력한다.
int
main(int argc, char
*argv[]) //
메인함수시작
{
int
fdForRead; // file descriptor for read
int
fdForWrite; // file
descriptor for write
char
buf[MAX_BUF]; // to define buffer
int
read_size; // read의off셋으로활용되는변수
int
write_size; // wrtie의off셋으로활용될변수
struct
stat info; // 파일의정보를받을구조체
int
fs; // fstat의리턴값을저장할변수
int
modeInfo; // getMode를mode를받을정수
char
bit[10]; //
rwxrwxrwx로출력하기위한변수
int
i=0; // for문의counter
변수
if(argc
!= 3) // 만약arument의사용법이잘못됐다면
{
printf("Usage : mycp.out source_file_name
destination_file_name\n\n");
// 사용법을알려준후
exit(-1); // 프로그램을종료한다.
}
fdForRead = open(argv[1],
O_RDWR); // 2번째argument를이용해서파일을열며읽기쓰기가능>
if(fdForRead
<0){ // 만약읽기가실패한다면
perror("cannot open the file because : "); // 메세지를출력후
exit(-1); // 프로그램을종료한다.
}
printf("\n\nThis
program is coping a file with the mode of file \n");
// 프로그램실행전출력메세지
fstat(fdForRead,
&info); //fstat
함 수는file
descriptor를이용하여stat 구조체에
// file에대한정보를저장하며여기서우리는mode를얻을수있다.
getMode(info.st_mode,bit); // getMode는가져온mode정보를rwxrwxrwx
형태로bit에대입한다.
printf("The
mode = %s \n\n",bit); // 현재파일의모드를출력하고
/*************************************************************************************
// Redirection
//
close(STDOUT_FILENO); // 만약redirection을쓰고싶으면이주석을해제하면된다.
************************************************************************************/
fdForWrite = open(argv[2],
O_RDWR | O_CREAT | O_EXCL, info.st_mode);
// stat 구조체에저장된st_mode를이용하여파일을생성하며
// 만약파일명이중복된다면O_EXCL
flag로인하여파일이생성되지않>
if(fdForWrite
== -1){ // 파일생성에실패하거나파일이존재한다면
perror("cannot open the file because : "); // 메세지와errno의메세지를같이출력한후
exit(-1); // 프로그램을종료한다.
}
while(1){ // while문은파일이다써질때까지반복되며
read_size =
read(fdForRead, buf, MAX_BUF); // 64바이트씩파일을읽는다
if(read_size
== 0) // 만약파일의끝이라면
break;
// 반복문을빠져나간다.
write_size =
write(fdForWrite, buf, read_size); // 64바이트씩새로운file에쓴다.
/********************
Redirection ******************************
//write_size
= write(STDOUT_FILENO, buf, read_size);
// redirection을이용한file 출력
***************************************************************/
}
printf("Successful!\n");
// 파일복사가완료되면메세지를생성후
close(fdForRead); // file descriptor들을닫아준다.
close(fdForWrite);
return
0;
}
char*
getMode(mode_t mode,char* bit) // file mode를출력하는함수
{
int
i=0; // 반복문의counter
int
index=0; // index는문자를저장할떄쓰인다
int
modeInfo = 00777 & (unsigned long)mode; // 777을mode와AND 연산한후
for(i=256;i>0;i=i/2){ // 그내용들을출력하는반복문을실행한다.
if((modeInfo
& i) == i) // 만약i는2^8부터2^0까지바뀌게되며
{ // and 연산이i값과같다면그flag는set이다.
if(index%3 == 0)
// rwx 위치에맞게문자열에저장된다.
bit[index] = 'r';
else if(index%3 == 1)
bit[index] = 'w';
else
bit[index] = 'x';
}
else
bit[index] = '-'; // 만약flag가0이라면'-'로문자열을채운다.
index++; // index를증가시킨후
}
return
bit; // 받았던문자열을반환한다.
}

