본문 바로가기
UNIX 프로그래밍

[2주차 실습] UNIX 실습 문제

by 서영선 2023. 10. 22.

< 9월 7일 실습(기초) 문제 >

 

 

 

1. 다음의 작업을 수행하는 프로그램을 작성하고, 프로그램 실행 후 실행 결과를 확인합니다.

 

(a) “test1" file을 나만 읽기쓰기 가능하게 생성하여 쓰기용으로 open 한 후, “test1" file에 문자 변수 ch에 저장된 문자를 10번 반복하여 씁니다. ch은 ‘X'로 초기화 합니다. 프로그램 종료 후 shell 상에서 cat 명령을 사용하여 ”test1" file에 문자 ’X'가 10개 쓰여 있는지 확인합니다.

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>

int main(void){
        char ch = 'X';
        int fd, i;

        fd = open("test1", O_WRONLY, 0600);
        for( i=0;i<10;i++){
                write(fd, &ch, 1);
        }
        return 0;
}

 

 

 

(b) “test2" file을 나는 읽기쓰기 가능하고, 나와 같은 그룹의 사용자들은 읽기만 가능하게 생성하여 쓰 기용으로 open 합니다. “test2" file에 정수 변수 data에 저장된 정수를 10번 반복하여 씁니다. data는 35로 초기화 합니다. 프로그램 종료 후 shell 상에서 cat 명령을 사용하여 ”test2" file에 35가 10번 쓰 여 있는지 확인합니다. shell 상에서 ls -l 명령을 사용하여 “test2" file의 크기를 확인합니다.

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(void){
        int data=35, fd, i;

        fd = open("test2",O_WRONLY| O_CREAT, 0640);
        for(i=0;i<10;i++){
                write(fd, &data, 4);
        }
        return 0;
}

 

 

(c) 이미 존재하는 “test1" file을 쓰기 가능하게 open 합니다. “test1" file에 문자 변수 ch에 저장된 문 자를 5번 반복하여 씁니다. ch은 ‘Y'로 초기화 합니다. 프로그램 종료 후 shell 상에서 cat 명령을 사용 하여 ”test1" file에 문자 ’Y'가 5개, 이어서 문자 ‘X'가 5개 쓰여 있는지 확인합니다.

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(void){
        char ch = 'Y';
        int fd, i;

        fd = open("test1",O_WRONLY);
        for(i=0;i<5;i++){
                write(fd, &ch, 1);
        }
        return 0;
}

 

 

(d) 이미 존재하는 “test1" file 내용을 보존하고, file의 가장 마지막 위치부터 쓰기 가능하게 open 합니 다. “test1" file에 문자 변수 ch에 저장된 문자를 5번 반복하여 씁니다. ch은 ‘Z'로 초기화 합니다. 프로 그램 종료 후 shell 상에서 cat 명령을 사용하여 ”test1" file에 문자 ’Y'가 5개, 이어서 문자 ‘X'가 5개, 그리고 마지막으로 문자 ’Z'가 5개 쓰여 있는지 확인합니다.

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(void){
        char ch = 'Z';
        int fd, i;

        fd = open("test1",O_WRONLY|O_APPEND);
        for(i=0;i<5;i++){
                write(fd, &ch, 1);
        }
        return 0;
}

 

 

 

(e) 이미 존재하는 “test1" file의 기존 내용을 전부 지우고, 쓰기 가능하게 open 합니다. “test1" file에 문자 변수 ch에 저장된 문자를 3번 반복하여 씁니다. ch은 ‘K'로 초기화 합니다. 프로그램 종료 후 shell 상에서 cat 명령을 사용하여 ”test1" file에 문자 ’K'만 3개가 쓰여 있는지 확인합니다.

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(void){
        char ch = 'K';
        int fd, i;

        fd = open("test1",O_WRONLY|O_TRUNC);
        for(i=0;i<3;i++){
                write(fd, &ch, 1);
        }
        return 0;
}

 

 

(f) “test2" file을 읽기 가능하게 open하고, 정수 5개를 읽어 정수 배열 data[10]의 0번부터 4번 원소 에 저장합니다. data[10] 배열은 0으로 초기화 합니다. printf() 명령을 사용하여 data 배열의 내용을 출 력합니다.

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(void){
        int data[10]={0}, fd, i;

        fd = open("test2",O_RDONLY);
        read(fd, data, 5*(sizeof(int)));
        for(i=0;i<10;i++){
                printf("%d ", data[i]);
        }
        return 0;
}

 

 


< 9월 7일 실습 문제 >

 

 

 

1. 다음의 작업을 수행하는 프로그램을 작성하고, 프로그램 실행 후 실행 결과를 확인합니다.

 

(a) “test1" file이 이미 존재하면, file open을 포기하고 ”test1" file이 존재하지 않는 경우, 나는 읽기쓰 기 가능하고 다른 모든 사용자들은 읽기만 가능하게 “test1” file을 생성한 후, 쓰기 가능하게 open 합 니다. "test1" file의 open에 실패한 경우에는 오류 메시지를 출력하고, 프로그램을 종료합니다. 그렇지 않은 경우에는 “test1" file에 문자 변수 ch에 저장된 문자를 10번 반복하여 씁니다. ch은 ‘K'로 초기화 합니다.

 

 

(b) ”test1“이 없는 상태에서 프로그램을 실행시키고, shell 상에서 cat 명령을 사용하여 ”test1" file의 내용을 확인합니다. 문자 ’K'가 10개가 쓰여 있는지 확인합니다.

 

 

(c) 위의 프로그램을 다시 한 번 실행 시켜, 오류 메시지 없이 실행이 되는지 확인합니다.

 

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

int main(void){
        char ch = 'K';
        int fd, i;

        fd= open("test1", O_WRONLY| O_CREAT| O_EXCL, 0644);

        if(fd==-1){
                printf("open error .............\n");
        }
        else{
                for(i=0;i<10;i++){
                        write(fd, &ch, 1);
                }
        }
        return 0;
}

 

 

< 실행 결과 >

test1을 확인해보면 K가 10개 쓰여진 것을 볼 수 있다.

 

 

 

 

 

 

 

 

2. 다음과 같은 작업을 수행하는 mycopy(실행 파일 이름)라는 프로그램을 작성하시오.

 

 

(a) 두 개의 file 이름을 문자열로 입력을 받는다. (scanf() 명령을 사용합니다.)

(b) 첫 번째 이름의 file이 존재하지 않으면, 오류 메시지를 출력한다.

(c) 첫 번째 이름의 file이 존재하고, 두 번째 이름의 file이 존재하지 않으면, 첫 번째 이름의 file의 내용 을 복사하여, 두 번째 이름의 file에 쓴다.

(d) 만약, 두 번째 이름의 file이 이미 존재하면, file 복사 전에 경고 message를 출력하고, 경고 message 후 문자 ‘Y’를 입력받으면, 복사를 수행한다. 만약, 문자 ‘Y’ 이외의 입력을 받으면 복사를 포 기한다.

(e) 두 번째 이름의 file이 이미 존재하고, 문자 ‘Y’가 입력 된 경우에는, 기존 file의 내용은 지우고, 첫 번째 이름의 file을 복사한다.

 

 

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(void){
        char n1[50], n2[50], buf[512], in;
        int i, fd1, fd2, n;

        scanf("%s %s", n1, n2);
       
        fflush(stdin);
        fd1 = open(n1, O_RDONLY);
        if (fd1 ==-1){
                printf("%s : No such file ...\n", n1);
                return 0;
        }

        fd2 = open(n2, O_WRONLY | O_CREAT| O_EXCL, 0600);
        if (fd2 == -1){
                printf("%s : File already exists... Do you want to overrite it?\n", n2);
                getchar();
                scanf("%c", &in);
                if (in != 'Y'){
                        return 0;
                }
                fd2 = open(n2, O_TRUNC | O_CREAT| O_WRONLY, 0600);
        }
        n= read(fd1, buf, 512);
        while(n >0){
                write(fd2, buf, n);
                n = read(fd1, buf, 512);
        }
        return 0;
}

 

 

 

 

< 실행 결과 >

 

 

 

 

 

 

댓글