linux_File_Env
Download
Report
Transcript linux_File_Env
Linux Programming
Spring 2009
File Handling
Important contents
Linux 에서 C 컴파일 방법
File 처리 프로그래밍
Linux 환경 접근 프로그래밍
Kongju National University
Linux System Programming
2/29
Basic compiling method
Linux C Compiler : gcc, cc
기본 : % gcc –o hello.c
% ./a.out
Object file option
% gcc –o hello hello.c
% ./hello
Compiler 도움말
% man gcc
% info gcc : 추가정보
Kongju National University
Linux System Programming
3/29
Header file
Header file 위치
Header file including
/usr/include/ 아래에 위치
Cf: /usr/include/[sys, linux, X11, g++-2]
% gcc –I/usr/openwin/include fred.c
프로그램 내 Header file including
#include <stdio.h>
Kongju National University
Linux System Programming
4/29
Library Linking
재사용 가능, 공통사용, 미리 컴파일된 함수
위치 : /lib /usr/lib
분류 :
정적 라이브러리 : .a
공유 라이브러리 : .so, .sa
Linking방법(default lib directory)
% gcc –o fred fred.c /usr/lib/libm.a
% gcc –o fred fred.c -lm
Linking방법(other lib directory)
% gcc –o xfred –L/usr/openwin/lib xfred.c -Lx11
Kongju National University
Linux System Programming
5/29
Library Linking (static lib)
정적라이브러리(static lib) :
.a
Linking at compile time
메모리 자원 낭비
동적라이브러리(dynamic lib) : …so.N N:번호
확인방법 : % ldd objectfile
compile 방법
lib 생성방법
% gcc –c bill.c fred.c
% ls *.o
bill.o fred.o
% gcc –c mainpgm.c
% gcc –o runpgm mainpgm.o
bill.o
% ./runpgm
Kongju National University
% ar crv libfoo.a bill.o fred.c
ac – bill.o
ac - fred.o
% ranlib libfoo.a :BSD계열에서
% gcc –o runpgm mainpgm.o
libfoo.a
% ./runpgm
Linux System Programming
6/29
System Calls
System calls
일반적으로 사용자 프로그램은 운영체제 직접 관여 금지
Kernel을 직접 통한 접근 금지
System call에 의하여 운영체제 자체 인터페이스로 접근
저수준의 함수호출
Kongju National University
Linux System Programming
File Handling Programming
Everything is FILE in Linux & Unix
File property
Low level file handling system call
/dev 아래의 모든 device에 동일한 방법 적용
주요 system calls
이름,생성/변경날짜, 허용권한,길이,inode정보
open(), read(), write() : close(), ioctl()
File I/O descriptor
0 (표준입력), 1 (표준출력), 3 (표준에러)
Kongju National University
Linux System Programming
8/29
write()
열린 파일이나 디바이스에 쓰기
#include <unistd.h>
Size_t write(int fildes,void *buf,size_t nbytes);
return=nbytes, 0=fail to write, -1=fail to call
#include <unistd.h>
main()
{
if ((write(1,"Here is some data\n",18)) != 18)
write(2,"A write error has occurred on file decriptor 1\n",47);
}
Kongju National University
Linux System Programming
9/29
read ()
열린 파일/디바이스로 부터 읽기
#include <unistd.h>
Size_t read(int fildes,void *buf,size_t nbytes);
return=nbytes, 0=fail to write, -1=fail to call
#include <unistd.h>
main()
{
char buffer[120];
int nread;
nread = read(0, buffer, 128);
if (nread == -1)
write(2, "A read error has occurred\n", 26);
if ((write(1,buffer,nread)) != nread)
write(2, "A write error has occurred\n",27);
}
Kongju National University
Linux System Programming
10/29
read testing
$echo hello there | simple_read
hello there
$ simple_read < test.txt
…..
Kongju National University
Linux System Programming
11/29
open()
파일/디바이스 열기
#include <fcntl.h>
#include <sys/types.h>
:
#include <sys/stat.h>
:
int open(const char *path,
int open(const char *path,
POSIX에서 불필요
POSIX에서 불필요
int oflags);
int oflags, mode_t mode);
return : >0(성공), -1(실패, errno:실패원인)
oflags :
O_RDONLY : 읽기 전용상태로 연다
O_WRONLY : 쓰기 전용상태로 연다
O_RDWR
: 읽기와 쓰기가 가능한 상태로 연다
그외 oflags의 비트조합으로 사용 가능
O_APPEND, O_TRUNC(기존내용제거후),
O_CREAT(필요시생성), O_EXCL(O_CREAT와 함께,배타적사용)
Kongju National University
Linux System Programming
12/29
open()
mode_t
S_IRUSR,S_IWUSR,S_IXUSR : 사용자 읽기,쓰기,실행
S_IRGRP,S_IWGRP,S_IXGRP : 그룹 읽기,쓰기,실행
S_IROTH,S_IWOTH,S_IXOTH : 기타사용자 읽기,쓰기,실행
open(“myfile”,O_CREAT, S_IRUSR|S_IXOTH);
Kongju National University
Linux System Programming
13/29
close ()
파일/디바이스 닫기
#include <unistd.h>
int close(int fildes);
return : 0(성공), -1(실패)
Kongju National University
Linux System Programming
14/29
저수준함수 파일복사 1 byte
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
main()
{
char c;
int in, out;
in = open("file.in", O_RDONLY);
out = open("file.out", O_WRONLY|O_CREAT,
S_IRUSR|S_IWUSR);
while(read(in,&c,1)) > 0)
write(out,&c,1);
}
Kongju National University
Linux System Programming
15/29
저수준 함수를 이용한 파일복사 1024bytes
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
main()
{
char block[1024];
int in, out;
int nread;
in = open("file.in", O_RDONLY);
out = open("file.out", O_WRONLY|O_CREAT,
S_IRUSR|S_IWUSR);
while((nread = read(in,block,sizeof(block))) > 0)
write(out,block,nread);
}
Kongju National University
Linux System Programming
16/29
Exercise : file copy(1 char)
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
main()
{
char c;
int in, out;
in = open("file.in", O_RDONLY);
out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
while(read(in, &c, 1) == 1)
write(out, &c, 1);
}
Kongju National University
Linux System Programming
17/29
File management system calls
파일 사용방법 제어, 상태정보 파악
주요 system calls
lseek
#include <unistd.h>
#include <sys/types.h>
off_t lseek(int fildes, off_t offset, int whence);
whence :
SEEK_SET : 절대 offset 위치
SEEK_CUR : 현재위치에서 상대위치
SEEK_END : 파일의 마지막에 위치
Kongju National University
Linux System Programming
18/29
continued!
fstat, stat & lstat
File descriptor관 관련된 파일의 상태 정보 파악
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int fstat(int fildes, struct stat *buf);
int stat(const char *path, struct stat *buf);
:link가 참조하는 파일 정보
int lstat(const char *path, struct stat *buf);
:symbolic link 자체 정보
* 자세한 사항은 필요시 %man fstat
Kongju National University
Linux System Programming
19/29
continued !
dup & dup2
파일을 접근하는 두개이상의 descriptor생성
하나의 파일에 대하여 두개의 접근이 가능토록
#include <unistd.h>
int dup(int fildes);
: return value는 새로운 file descriptor
int dup2(int fildes, int fildes2);
: fildes2에 복제
Kongju National University
Linux System Programming
20/29
Programming Exercise
Programming Exercise 1
Read from open file with 1024 bytes reading(1 block)
1.
declare char buf[1024]
2.
in while loop, condition should be changed
read(…,buf,size..)
Programming Exercise 2
touch 명령어와 유사한 기능, 단 파라메터로 파일 permission mode줄 수 있도록
Ex: mytouch –r –w –r
Programming Exercise 3
cp 명령어와 유사한 기능, 단 파일만 copy
Due date : next week, uploading methods will be provided
Kongju National University
Linux System Programming
21/29
Standard I/O library
Low level I/O 의 불편함 해소
공통적인 라이브러리 제공
Head file : stdio.h
주요 function calls
fopen, fclose
fread, fwrite
fflush, fseek
fgetc, getc, getchar
fputc, putc, putchar
printf, fprintf, sprintf
scanf, fscanf, sscanf
Kongju National University
Linux System Programming
22/29
fopen(), fclose()
#include <stdio.h>
FILE *fopen(const char *filename,const char *mode);
mode : “r”, “w”, “a” “r+”, “w+”, “a+” : + =갱신상태로
int fclose(FILE *stream)
}
Kongju National University
Linux System Programming
23/29
Ex : File copy
#include <stdio.h>
main(int argc, char *argv[])
{
FILE *infile, *outfile;
char buf[256];
if(argc !=3) {
printf(“ERROR : parameter mismatch\n”);
return;}
infile=fopen(argv[1],”r”); outfile=fopen(argv[2],”w”);
while(fgets(buf,256,infile)!=NULL){
fprinf(outfile,”%s”,buf);
}
fclose(infile);fclose(outfile);
return;
}
Kongju National University
Linux System Programming
24/29
fgetc() , getc() :단일문자 입력
#include <stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream); macro로 사용
#include <stdio.h>
FILE *input;
char inputchar;
input=fopen(“date.in”,”r”);
…
inputchar=fgetc(input);
…
fclose(input);
…
Kongju National University
Linux System Programming
25/29
fputc(), putc()
#include <stdio.h>
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream); macro로 사용
주의: c는 unsigned char
#include <stdio.h>
FILE *input,*output;
char inputchar;
input=fopen(“date.in”,”r”);
output=fopen(“data.out”,”w”);
while((inputchar=fgetc(input))!=EOF) {
fputc(inputchar,output);
}
……
fclose(input); fclose(output);
…
Kongju National University
Linux System Programming
26/29
fgets(), gets() :문자열 입력
#include <stdio.h>
int fgets(char *s,int n, FILE *stream);
int *gets(char *s); macro로 사용
#include <stdio.h>
FILE *input;
int maxlen=100;
char inputstring[maxlen];
input=fopen(“date.in”,”r”);
fgets(inputstring,maxlen,input);
……
fclose(input);
…
Kongju National University
Linux System Programming
27/29
fputs(), puts() :문자열 출력
#include <stdio.h>
int fputs(char *s, FILE *stream);
int *puts(const char *s); macro로 사용
#include <stdio.h>
FILE *input,*output;
int maxlen=126;
char instring;
input=fopen(“date.in”,”r”);
output=fopen(“data.out”,”w”);
while((fgets(instring,maxlen,input)!=NULL ) {
fputs(instring,output);
}
……
fclose(input); fclose(output);
…
Kongju National University
Linux System Programming
28/29
fscanf(), fprintf() :형식화된 입출력
#include <stdio.h>
int fscanf(FILE *stream, const char *format, argument….);
int fprintf(FILE *stream, const char *format, argument….);
Kongju National University
Linux System Programming
29/29
Ex: Grading
#include <stdio.h>
main()
{
FILE *infile, *outfile;
char name[20];
int kor,mat, eng, tot;
if((infile=fopen("data.in","r"))== NULL) {
printf("ERROR: cannot open file data.in\n"); }
if((outfile=fopen("data.out","w"))== NULL) {
printf("ERROR: cannot open file data.out\n");}
while(fscanf(infile,"%s%d%d%d",name,&kor,&mat,&eng) !=
EOF){
tot=kor+mat+eng;
fprintf(outfile,"%8s%3d%5d%5d%5d\n",name,kor,mat,eng,tot);
}
fclose(infile); fclose(outfile);
}
Kongju National University
Linux System Programming
30/29