티스토리 뷰

리눅스의 mkdir 명령어를 mkdir 함수를 이용해 구현하기 위해,

함수의 파라미터 중 permission을 의미하는 mode 값을 char*형에서 8진수로 만드는 방법을 찾아보다가 기록하는 포스팅이다.

 

char arg[4] = {'0','7','7','7'};

arg = "0777"인데, 이를 8진수인 0777로 바꾸려고 한다.

 

int num_arg[4] = {0,};
for(int i=0; i<4; i++)
	num_arg[i] = arg[i]-'0';    // 문자와 형태가 같은 숫자로 변환

mode_t mode;
mode = num_arg[3];
mode = mode | (num_arg[2]<<3);
mode = mode | (num_arg[1]<<6);
mode = mode | (num_arg[0]<<9);

arg[i] - '0' 동작을 통해 '0'을 0으로, '7'를 7로 바꿀 수 있다.

num_arg = {0, 7, 7, 7}이 된다. 이를 이제 8진수 0777로 바꿀 것이다.

mode 변수는 int형으로 선언해줘도 된다.

mode 변수에 우선 일의 자리인 num_arg[3]을 할당하고 이는 일의 자리이므로 shift하지 않는다. => mode = 7

다음으로 num_arg[2]을 8^1 자리에 할당해야 하므로 왼쪽으로 3 shift해서 2^3 = 8^1 자리의 값으로 만든다. 그리고 이전 값과 OR 연산을 해주면 => mode = 77

다음으로 num_arg[1]을 8^2 자리에 할당해야 하므로 왼쪽으로 6 shift해서 2^6 = 8^2 자리의 값으로 만든다. 그리고 이전 값과 OR 연산을 해주면 => mode = 777

마지막으로 num_arg[0]도 똑같이 해주면 mode = 0777이 된다.

 

 

참고 : https://kldp.org/node/34831

반응형

댓글