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

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

by 서영선 2023. 10. 22.

 

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

 

 

1. 다음과 같이 실행하는 프로그램을 작성 한 후 실행시킵니다.

 

(a) 읽기쓰기 가능한 "data1" file을 생성하고, 문자 ‘X'를 10개 씁니다.

(b) "data1" file의 첫 번째 위치로 file pointer를 옮긴 후 문자 ‘Y'를 하나 씁니다.

(c) "data1" file의 마지막 문자 다음 위치로 file pointer를 옮긴 후 문자 ‘Y'를 하나 씁니다.

(d) "data1" file의 2, 4, 6, 8번째 문자를 ‘Z'로 바꾸어 씁니다.

(e) "data1" file의 15번째 위치에 문자 ‘T'를 씁니다.

(f) "data1" file의 뒤에서 2번째 위치에 문자 ‘S'를 씁니다.

(g) 'S' 바로 앞에 문자 ‘W'를 씁니다.

(h) 프로그램 실행 후 cat 명령을 이용하여 “data1" file의 내용이 ”YZXZXZXZXXYWST“ 인지 확인합니 다. vi 명령으로 ”data1" file의 내용을 확인합니다. cat 명령으로 확인한 내용과 차이가 나는 이유를 생 각해 봅니다.

 

 

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

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

        fd = open("data1", O_RDWR |O_CREAT|O_TRUNC, 0600);
        for(i=0;i<10;i++){
                write(fd, &ch,1);
        }

        lseek(fd, 0, SEEK_SET);
        write(fd, "Y", 1);

        lseek(fd, 0, SEEK_END);
        write(fd, "Y", 1);

        for(i=1;i<8;i+=2){
                lseek(fd, i, SEEK_SET);
                write(fd, "Z", 1);
        }

        lseek(fd, 14, SEEK_SET);
        write(fd, "T", 1);



        lseek(fd, -2, SEEK_END);
        write(fd, "S",1 );

        lseek(fd, -2, SEEK_CUR);
        write(fd, "W", 1);

        return 0;
}

 

< 출력 결과 >

  • index 11 위치에는 데이터 아무것도 쓰지 않았기 때문에 cat 명령으로는 아예 출력이 안 된 것이고, vi 명령으로는 빈 값을 뜻하는 쓰레기 값이 들어가있어서 이렇게 출력이 된 것임

 

 

 


< 9월 12일 실습 문제 >

 

 

1. 다음과 같은 작업을 수행하는 프로그램을 작성하시오. 데이터 쓰기 전에는 lseek() 명령에 SEEK_CUR를 데이터 읽기 전에는 lseek() 명령에 SEEK_SET을 사용합니다.

 

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

int main(void){
    
    int i, fd, k, k1, data1[10], data2[10];

    fd=open("data3", O_RDWR|O_CREAT|O_TRUNC, 0600);

    for (i=0;i<10;i++){
      scanf("%d", &data1[i]);
    }

    for(i=0;i<5;i++){
      write(fd, data1 + i, sizeof(int));
        lseek(fd, sizeof(int), SEEK_CUR);
    }

    lseek(fd, -9 * sizeof(int), SEEK_CUR);

    for(i=5;i<10;i++){
      write(fd, data1 + i, sizeof(int));
        lseek(fd, sizeof(int), SEEK_CUR);
    }

    lseek(fd, 0, SEEK_SET);

    read(fd, data2, 10 * sizeof(int));

    for (i=0;i<10;i++) {
      printf("%-5d", data1[i]);
    }

    printf("\n");

    for (i=0;i<10;i++){
      printf("%-5d", data2[i]);
    }

    printf("\n");

    return 0;
}

 

 

 

 

 


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

 

1. stat() 명령을 이용하여 "data1" 파일의 acess permission, link 수, 파일 크기를 출력하는 프로그램 을 작성하시오.

 

#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
int main(){
        struct stat buf;
        stat("data1", &buf);
        printf("%o\n %d\n %ld\n", buf.st_mode&0777, buf.st_nlink, buf.st_size);
        return 0;
}

 

댓글