공부한 유튜브 링크: 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
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
#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);
}
// 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]);
}
}
/etc/passwd : 시스템에 등록된 사용자의 정보들이 담겨있는 파일입니다. 이 파일을 이용해서 사용자의 계정과 인증을 관리
/etc/gruop : 각 row에 그룹이름:그룹번호:그룹에 속한 유저 형태로 그룹들을 관리
/etc/shadow : 암호화된 패스워드와 패스워드 설정 정책이 기재
#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);
}
#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);
}
ls /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);
}
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);
}
}