[보류] 퍼미션을 유지하면서 파일을 복사하는 프로그램 작성중 도와주세요=>일단 혼자 해보도록하겠습니다 ㅠ
글쓴이: zanyhan / 작성시간: 일, 2007/04/08 - 7:42오후
학교에서 리눅스를 배우고 있는데 워낙 지식이 얕아서 도움을 요청합니다.
밑에 소스는 파일복사를 목적으로하는 프로그램을 작성된것입니다.
그런데 이렇게 복사하면 퍼미션이 다르게 설정되는데요,,
퍼미션을 유지한채 복사하게 수정해야합니다.
오랫동안 네이버와 구글등 각종 지식인과 KLDP를 찾아보니
stat함수 (st_mode이용)로 원본파일의 퍼미션을 읽어서와서 chmod함수로
복사된파일의 퍼미션을 바꾸면 될것같은데요,,
이 방법으로 접근하는것이 맞는건가요..??
C에대한 지식이 별로 없어서 수정하려해도 갈피를 못잡겠습니다 ㅠㅠ..
귀찮으시더라도 꼭 도움 부탁드립니다!!
아래는 원본 소스입니다.
어떻게 stat랑 chmod추가하면 될것같은데.. 문법맹이라서 ㅠㅠ..
부탁드립니다!!
#include <errno.h> #include <fcntl.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #define PERMS (S_IRUSR | S_IWUSR) #define READ_FLAGS O_RDONLY #define WRITE_FLAGS (O_WRONLY | O_CREAT | O_TRUNC) static int readwrite(int fromfd, int tofd) { char buf[1024]; int bytesread; if((bytesread = read(fromfd, buf, 1024)) < 0) return -1; if(bytesread == 0) return 0; if(write(tofd, buf, bytesread) < 0) return -1; return bytesread; } static int copyfile(int fromfd, int tofd) { int bytesread; int totalbytes = 0; while((bytesread = readwrite(fromfd, tofd)) > 0) totalbytes += bytesread; return totalbytes; } static void *copyfilemalloc(void *arg) { int *bytesp; int infd, outfd; infd = *((int *)(arg)); outfd = *((int *)(arg) +1); if((bytesp = (int *)malloc(sizeof(int))) == NULL) return NULL; *bytesp = copyfile(infd, outfd); close(infd); close(outfd); return bytesp; } int main(int argc, char *argv[]) { int *bytesptr; int error; int fds[2]; pthread_t tid; if(argc != 3){ fprintf(stderr, "Usage : %s fromfile tofile\n",argv[0]); return 1; } if(((fds[0] = open(argv[1], READ_FLAGS)) == -1) || ((fds[1] = open(argv[2], WRITE_FLAGS, PERMS)) == -1)){ perror("Failed to open the files"); return 2; } if(error = pthread_create(&tid, NULL, copyfilemalloc, fds)){ fprintf(stderr, "Failed to create thread: %s\n", strerror(error)); return 3; } if(error = pthread_join(tid, (void **)&bytesptr)){ fprintf(stderr, "Failed to join thread: %s\n", strerror(error)); return 4; } printf("Number of bytes copied: %d\n", *bytesptr); return 0; }
Forums:
꼭 프로그램을 만들어야하는건가요?
과제같은거로... 아니라면 -p옵션을 줘서 cp로 되는데요... 자세한건 man cp
위의 프로그램을 조금 수정하면 되는건데요,,
위의 프로그램에 한두줄 추가와 두세줄 수정정도로도 퍼미션이 유지된채 파일복사가 가능하다고 했습니다.
stat와 chmod함수를 사용해서 프로그램을 수정한다는 접근방법이 처음부터 잘못된것인지도 모르겠지만
몇시간동안 서핑하면서 자료를 모은 결과로 저는 접근방법이 옳다고 생각하는데.. 확실하진 않습니다 ㅠㅠ
도움 부탁드립니다-!!
저는 리눅스
저는 리눅스 프로그래밍을 별로 안해봐서^^
GNU fileutils의 구현을 참고하시면 도움이 될듯 합니다.
절망으로 코딩하고 희망으로 디버깅하자.
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
절망으로 코딩하고 희망으로 디버깅하자~~ 하하핫!! ㅠㅠㅎㅎ
정말 딱 가슴에 와닫는군요.. ㅠㅠ
코드를 올리실때는 <code> </code>를 사용해주세요.
요새 화일 권한 문제를 물어보시는 분들이 많네요.
어디서 과제가 나왔나요^^
일단 stat과 chmod 함수를 사용하시면 됩니다.
원본파일의 권한을 읽고 복사한 파일의 권한을 설정하는 것은 복사가 끝난후
즉, close까지 하고 하시면 됩니다.
그리고 소스가 잘린건지 copyfile이라는 함수내용이 없네요.
코드를 올리실때는 code태그를 이용해주세요.
http://kldp.org/filter/tips 를 참고하세요.
http://jungjun.net
stat() 을 사용하면
stat() 을 사용하면 원본 파일의 퍼미션을 얻어올 수 있습니다.
open() 의 세번째 인자는 (O_CREAT 로 만들어지는) 새 파일의 퍼미션을 정할 수 있습니다.
"한두줄 추가와 두세줄 수정정도" 도 많습니다.
기억이 가물가물
기억이 가물가물 한데, open 으로 생성할때 umask 영향 받을겁니다. 고로 고대로 하면 안보이는 삽질이..
umask 기본값도 가물가물.. 숙제는 직접하세요.
댓글 달기