2017-12-14 16 views
-1

나는 c 매개 변수에 파일 이름과 파일에 대한 사용 권한이있는 함수를 작성해야합니다. (예 : create ("f", "rwxr_xr_x"))이 함수는 "rwxr_xr_x"권한을 받고 "0"을 반환하는 파일 f를 만듭니다. 파일이 이미 있거나 생성되지 않으면 0과 다른 번호를 반환합니다.리눅스에서 주어진 이름과 권한을 가진 파일을 만들려면 c

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/stat.h> 

int create(char *name, char *mode) 
{ 
    int fp = fopen(name, "r+"); 
    if (fp > 0) 
    { 
     int i, n = 0; 
     for (i = 0; i < 9; i = i + 3) 
     { 
      int nr = 0; 
      if (mode[i] == 'r')  nr += 4; 
      if (mode[i + 1] == 'w') nr += 2; 
      if (mode[i + 2] == 'x') nr += 1; 
      n = n * 10 + nr; 
     } 
     chmod(name, n); 
     return 0; 
    } 
    else 
     return -1; 
} 

int main(int argc, char* argv[]) 
{ 
    if (argc != 3) printf("%s\n", "Error: Incomplet number of arguments!"); 
    int fp; 
    fp = create(argv[1], argv[2]); 
    if (fp == 0) printf("%s\n", "File successfully created!"); 
    else printf("%s\n", "Could not create file!"); 
    return 0; 
} 

나는 R + 모드에서 파일을 열려고 시도하고 난이) 맞다면 확실하지 {, 권한을 변경 chmod를 사용 : 는 여기에 내가 생각 해낸 코드입니다. 컴파일 할 때 다음과 같은 경고 메시지가 나타납니다. "초기화를하면 int fp=fopen(name, r+) 행의 캐스트가없는 포인터의 정수가됩니다. 누군가가이 문제를 해결하고 코드가 정확한지 알려주시겠습니까? 업데이트 그래서 몇 가지 변경 사항을 제안 했는데도 올바른 사용 권한을 제공하지 못한다고 생각합니다. (리눅스에 익숙하지 않았으므로 잘못되었을 수도 있습니다.) 다음은 현재 코드의 모습입니다 :

#include <stdio.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <fcntl.h> 
int create(char *name, char *mode) 
{ 
    int i,n=0; 
    for(i=0; i<9; i=i+3) 
    { 
     int nr=0; 
     if(mode[i]=='r') nr+=4; 
     if(mode[i+1]=='w') nr+=2; 
     if(mode[i+2]=='x') nr+=1; 
     n=n*8+nr; 
    } 
    int fl=creat(name, n); 
    printf("%d\n", n); 
    if(fl>0) 
     return 0; 
    else return -1; 
} 

int main(int argc, char* argv[]) 
{ 
    if(argc != 3) 
     printf("%s\n", "Error: Incomplet number of arguments!"); 

    int fp; 
    fp=create(argv[1], argv[2]); 
    if(fp==0) printf("%s\n", "File successfully created!"); 
    else printf("%s\n", "Could not create file!"); 
    return 0; 
} 

또한 파일이 이미 있는지 확인할 수 있습니까?이 경우 함수가 0과 다른 값을 반환하고 오류 메시지를 출력해야하기 때문에

이 라인
+2

'fopen'은 int가 아닌'FILE *'을 반환하고'open'은'int'를 반환합니다. –

+0

@PawanKartik : 질문은 디렉토리가 아닌 파일을 만드는 것과 관련이 있습니다. –

+0

@Alexandra_p : [open/creat] (https://linux.die.net/man/2/creat)을 사용하지 않은 이유는 무엇입니까? –

답변

0

첫째 문제 :

int fp=fopen(name, "r+"); 

fopen 그래서 그 라인이

FILE *fp=fopen(name, "r+"); 

해야 유형 FILE *하지 int의 값을 반환 그리고 그 fpNULL가 아닌 경우 테스트해야 의미 not > 0.

파일을 만든 후에는 fclose(fp)을 호출하여 파일을 닫아야합니다.

권한을 처리하는 코드도 잘못되었습니다. 쉘에서 chmod 명령에 일반적으로 전달하는 값은 10 진수가 아닌 8 진수이므로이 행은 잘못되었습니다.

n=n*10+nr; 

매번 n 번을 8 개씩 입력하고 싶습니다.

비트 필드이므로 '| ='연산자를 사용하여 추가를 사용하지 않고 적절한 비트를 변경하여 코드를 향상시킬 수 있습니다.

if(mode[i]=='r') nr |=4; 
if(mode[i+1]=='w') nr |=2; 
if(mode[i+2]=='x') nr |=1; 

또한 실제로 모드가 루프 전에 9 자 이상인지 확인해야합니다.

+0

제안 해 주셔서 감사합니다. 그러나 n을 8로 곱하는 이유는 무엇입니까?두 번째 매개 변수는 8 진수 여야합니다. 예를 들어 rwxrwxrwx n = 511을 취하면 두 번째 매개 변수가 0777이되지 않아야합니까? 나는 n을 8로 곱한이 예제를 테스트했고 owner와 group에 대해 올바른 사용 권한 (읽기 및 쓰기)을 설정했지만 다른 것들은 읽기 전용으로 표시되고 읽기 전용이어야 할 때도 나타납니다. –

+0

@Alexandra_p 만약'n'이 511 (십진수)이면 0777은 8 진수입니다. 만약 당신이 10 배를 곱하면 777이됩니다. 이것은 8 진수로 1411입니다. –

+0

당신이 기대하는 것처럼 작동하지 않는 이유는 umask가 모드에 영향을 받기 때문입니다. 여러분이 원하는 실제 권한을 얻으려면'chmod'를해야합니다. –