System Programming

joDMSoluth·2022년 5월 29일
0

공부한 유튜브 링크: https://www.youtube.com/watch?v=6OSeJFo6GOc&ab_channel=linuxhint

공부환경

Mac에서 Docker로 Ubuntu 20버전을 띄워 공부를 시작 했다.
참고) 영상에서 사용하는 언어는 C언어

처음엔 아무것도 설치되지 않아 gcc 조차 없으므로 build-essential을 설치하여 필수 패키지들을 세팅하자

apt update && apt install build-essential
gcc --version

나는 ~/git/systemPrograming 에서 작업하도록 하겠다.

mkdir -p ~/git/systemProgramming
cd ~/git/systemProgramming

File IO

CProgram을 작성합니다.

mkdir fileio && cd fileio
touch CProgram.c
vi CProgram.c
#include <stdio.h>
#include <stdlib.h>


struct threeNumb {
  int num1, num2, num3;
};

int main () {
  int num;
  struct threeNumb number;
  
  FILE *fptr1;
  
  if((fptr1 = fopen("program.bin", "wb")) == NULL) {
    printf("ERROR OPENING FILE!");
    exit(1);
  } else {

    for(num=1; num<5; ++num) {
      number.num1 = num;
      number.num2 = 2*num;
      number.num3 = 2*num + 3;
      
	  // size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream);
      // count 항목까지, 길이에서 size 바이트의 각각, buffer에서 출력 stream까지 씁니다.
      fwrite(&num, sizeof(struct threeNumb), 1, fptr1);
    }

    fclose(fptr1);
  }

  FILE *fptr2;

  if((fptr2 = fopen("program.bin", "rb")) == NULL) {
    printf("ERROR OPENING FILE!");
    exit(1);
  } else {

    for(num=1; num<5; ++num) {
      fread(&num, sizeof(struct threeNumb), 1, fptr2);
      printf("num1: %d\t, num2: %d\t, num3: %d\n", number.num1, number.num2, number.num3);
    }

    fclose(fptr2);
  }
}
gcc CProgram.c -o tst
chmod -x ./txt
./tst

Process

#include <stdio.h>
// POSIX 운영체제 API에 대한 액세스를 제공하는 헤더파일이다
#include <unistd.h>

int main() {
  int proc_id, par_proc_id;
  proc_id = getpid();

  par_proc_id=getppid();
  
  printf("PROCESS ID: %d\n", proc_id);
  printf("PARENT PROCESS ID: %d\n", par_proc_id);
}

memory allocation

// malloc() : memory allocation
// calloc() : contiguous allocation
// free() : de-allocate
// realloc() re-allocate

#include <stdio.h>
#include <stdlib.h>

int main() {
  int* ptr;
  int num, sum=0;

  num=8;
  printf("We have %d elemnets to allocate memory to\n", num);
  
  // ptr = (cast-type*) malloc(byte-size);
  ptr = (int*)malloc(num*sizeof(int));
  
  if(ptr==NULL) {
    printf("Memory allocation failed");
    exit(0);
  } else {
    printf("Memory allocation has been successful");
  }

  for(int i=0; i<num; ++i) {
    ptr[i] = i+1;
  }

  printf("inserted %d elements in the block are as follows:\n", num);
  
  for(int i=0; i<num; ++i) {
    printf("%d\n", ptr[i]);
  }
}

User & Group

/etc/passwd : 시스템에 등록된 사용자의 정보들이 담겨있는 파일입니다. 이 파일을 이용해서 사용자의 계정과 인증을 관리
/etc/gruop : 각 row에 그룹이름:그룹번호:그룹에 속한 유저 형태로 그룹들을 관리
/etc/shadow :  암호화된 패스워드와 패스워드 설정 정책이 기재

Time function

#include <stdio.h>
#include <time.h>

void func_name () {
  printf("Function starts\n");
  printf("Press Return to stop function \n");
  for(;;) {

    if(getchar()) break;
  }
  printf("Function ends \n");
}

int main() {
  clock_t t;
  t = clock();
  func_name();
  t = clock() - t;
  
  double time_taken_by_func = ((double)t)/CLOCKS_PER_SEC;

  printf("The precssing time of function is: %f", time_taken_by_func);
}

System Limit

#include <stdio.h>
#include <limits.h>

int main() {
  printf("LONG_MIN: %d \n", LONG_MIN);
  printf("LONG_MAX: %d \n", LONG_MAX);
  printf("CHAR_MIN: %d \n", CHAR_MIN);
  printf("CHAR_MAX: %d \n", CHAR_MAX);
  printf("CHAR_BIT: %d \n", CHAR_BIT); 
}

System & Process Info

ls /proc

proc 파일 시스템

운영체제의 각종 정보를 커널모드가 아닌 유저 모드에서 쉽게 접근 할 수 있도록 만들어 주어 프로그래머가 시스템 프로그래밍에 적극 활용 가능

# 프로세스 정보 보기 /proc/[PID]/status
cat /proc/1/status
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/utsname.h>

int main() {
  struct utsname buff;

  errno = 0; 

  if(uname(&buff) != 0) {
    perror("uname doesn't return 0, so there is no an error");

    exit(EXIT_FAILURE);
  }

  printf("System Name = %s \n", buff.sysname);
  printf("Node Name = %s \n", buff.nodename);
  printf("Release Name = %s \n", buff.release);
  printf("version = %s \n", buff.version);
  printf("machine = %s \n", buff.machine);
}

File System

sys/statvfs 파일시스템 관련 정보를 가져오는 라이브러리

struct statfs {
    unsigned long f_bsize    File system block size. 
    unsigned long f_frsize   Fundamental file system block size. 
    fsblkcnt_t    f_blocks   Total number of blocks on file system in units of f_frsize. 
    fsblkcnt_t    f_bfree    Total number of free blocks. 
    fsblkcnt_t    f_bavail   Number of free blocks available to 
                             non-privileged process. 
    fsfilcnt_t    f_files    Total number of file serial numbers. 
    fsfilcnt_t    f_ffree    Total number of free file serial numbers. 
    fsfilcnt_t    f_favail   Number of file serial numbers available to 
                             non-privileged process. 
    unsigned long f_fsid     File system ID. 
    unsigned long f_flag     Bit mask of f_flag values. 
    unsigned long f_namemax  Maximum filename length. 
};
#include <stdio.h>
#include <sys/statvfs.h>

int main () {
  struct statvfs buf;
  
  if(statvfs(".", &buf) == -1) {
    perror("error");
  } else {
    printf("each block has a size of %ld bytes\n", buf.f_frsize);

    printf("there are %ld blocks available out of %ld\n", buf.f_bavail, buf.f_blocks);
  }
}
profile
풀스택이 되고 싶은 주니어 웹 개발자입니다.

0개의 댓글