syscall C 프로그래밍 언어에서 syscall(시스템 호출의 줄임말)은 파일에 데이터 읽기 또는 쓰기, 새 프로세스 생성 또는 메모리 할당과 같은 특정 작업이나 서비스를 수행하기 위해 프로그램이 운영 체제에 요청하는 것입니다. Syscalls는 사용자 수준 프로그램이 시스템의 기본 하드웨어 및 소프트웨어 리소스와 상호 작용할 수 있는 방법을 제공합니다. 다음은 unistd.h 헤더 파일에서 제공하는 "syscall" 함수를 사용하여 C에서 syscall을 만드는 방법의 예입니다. #include #include #include int main() { long result = syscall(SYS_getpid); printf("Process ID: %ld\n", result); return 0; } ..
pthread_create #include int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine), void *arg); 새 쓰레드를 만드는 함수. 쓰레드 ID, 쓰레드 attribute, 쓰레드 시작함수, 쓰레드 시작함수의 argument가 들어간다. output으로 정상작동시 0, 비정상작동시 -1을 반환한다. exit(num) 시 process가 종료되고 num을 반환한다. main thread 가 죽을경우 같이 죽는다. 하지만 pthread_exit을 하면 종속성에서 벗어날 수 있다. child thread 가 일 하기 전에 main thread 가 죽는걸 방지하고 싶다면 pthread_join..
포인터란 선언문과 함께 쓰인 포인터는 자료형에 불과하다. 하지만 선언문 없이 홀로 쓰인 포인터는 오른쪽 변수에 담긴 주소값에 담긴 변수로 가라는 뜻이다. char z = 1; char *a = &z; char **b = &a; char ***c = &b; *a = z *b = a = &z; *c = b = &a; ***c =z ; 여기서 = 은 대입의 의미가 아니라, 무엇이 저장되었다는 의미로 쓰인다. 변수는 값을 담고, 캐릭터 포인터는 변수값의 주소를 담는다. 캐릭터 더블포인터는 포인터값의 주소를 담고, 캐릭터 트리플포인터는 더블포인터값의 주소를 담는다. a에는 z의 주소가 저장되어 있으므로 *a는 z의 변수값이 담겨있다. b에는 a의 주소가 저장되어 있으므로 *b는 a의 변수값이 담겨있다. 다시말해 ..
malloc heap 메모리 가져오기. 함수 쓸때 전역변수 안만들기 위해 많이 사용 strstr string안에서 특정 string 찾을때 사용 strncpy memcpy랑 같은 용도. string 을 복사. 일반포인터 상대론 잘 안됨. memccpy 2부터 4동안 3이 나올때까지의 문자열을 1에 저장 strctr + memcpy라고 보면됨. strlen \0전까지 세줌. sizeof 해당 포인터에 저장된 메모리 크기 sscanf 문자열을 나누어 할당할때 사용 sprintf 문자열을 합칠때 사용 -> 포인터 구조체 변수 접근할때 사용. 일반구조체는 .으로 접근. strncmp 1과 2를 3동안 비교해서 기면 1 아님 0 atoi 문자열을 값으로 이어줌 '1' '2' '3' '4' -> 1234 strto..
이번엔 HTTP를 통해 통신을 해보자. 도메인을 입력하면 적절한 메시지로 변환하여 서버에 쏴주고 그 대답을 듣는 내용이다. 추후엔 읽어들일때 buf length를 인식해 종말점을 계산해주는 기능을 추가하려 한다. 배운점 1. character pointer를 문자열로 바꾸는법 char *ip_char = "172.16.3.80"; char ip[IP_LEN]; for(int i = 0; i ip 구조체는 . 으로 접근해서 수정. 하지만 포인터는 . 으로 접근할수 없어서 만든것이 ->..
char *str[16] = {"a", "b", "c", "d"}; char **ptr = str; ptr[4] = "e"; for (int i = 0; i < strlen(str) + 5; i++){ printf("string %d is %s\n", i, ptr[i]); } str 자체는 포인터 없이도 그 문자열의 시작을 가리킨다. *str 은 문자열의 개별적인 칸들 즉 0번째, 1번째, 2번째,, 칸을 가리킨다. 그래서 일련의 문자열을 선언하려면 이걸 써야한다. **str 은 문자열의 특정한 칸을 가리킨다. 그래서 특정 문자열을 선언하려면 이걸 써야한다.
화살표의 의미 구조체를 포인터로 가져왔을 경우 . 대신 쓰는 것. #include typedef struct { int s_id; int age; } Student; int main(){ Student goorm; Student *ptr; ptr = &goorm; (*ptr).s_id = 1004; // (*ptr).age = 20; ptr->age = 20; printf("goorm 의 학번 : %d, 나이 : %d\n", goorm.s_id, goorm.age); } goorm이 바꾸고자하는 구조체. *ptr이 이걸 바꾸기 위한 손가락. 이때 손쉽게 바꾸는 것이 바로 -> 기호. struct hostent *he; struct in_addr **addr_list; struct in_addr addr;..
HTTP 구조 HTTP 헤더와 본문으로 구성되어 있다. HTTP 본문에는 실제로 통신과정에서 주고 받을 컨텐츠가 담겨져 있다. HTTP헤더는 HTTP메시지(요청/응답)와 본문에 대한 정보를 말해주고 있다. 이에 대해서 이해하는 것이 실제로 중요하다. 해당 메시지가 제공하는 기능에 대한 최소한의 정보가 정리된 요약본이라고 할 수 있기 때문이다. 헤더에 그 프로토콜에 불필요한 내용을 담으면 네트워크로 전송되는 데이터의 크기가 커져서 빠른 전송이 불가능하기 때문에 프로토콜을 설계할 때부터 꼭 필요한 내용만 담아야 하고, 모든 기능이 표현되어야 한다. 이에 대해 HTTP 헤더는 크게 세가지로 구성되어 있다. General Header 전송되는 컨텐츠에 대한 정보보다는, 요청/응답이 이루어지는 날짜 및 시간등에 ..
HTTP 란 HyperTest Transfer Protocol로 문서간에 링크를 전송하는 프로토콜. HTML, 텍스트, 이미지, 음성, 영상, JSON 등 모든 형태의 데이터가 전송이 가능. 서버간의 데이터 전송에도 거의다 이거 씀. HTTP/1.1, HTTP/2 는 TCP를 기반으로 하고 있다. 하이퍼텍스트란 참조(하이퍼링크)를 통해 독자가 한 문서에서 다른 문서로 즉시 접근할 수 있게 하는 텍스트 HTTPS HyperTest Transfer Protocol SSL(Secure Socket Layer) HTTPS 는 HTTP에서 보안이 강화된 친구. HTTPS간에 전송되는 데이터는 추가적인 보안 계층이 존재. (TLS, 전송 보안 계층 프로토콜) 특징 클라이언트 서버구조 - request, respon..
지금 하는건 C언어를 사용해서 fgets 로 buf 크기를 제한한 환경에서 HTTP stream 을 처리하는 일을 해보고 있다. 왜하냐? 싶지만 우리가 편하게 쓰는 java, python 의 response, request 객체 안에서 어떤 일이 벌어지는지 캐시, 커널이 얼마나 감사한 존재인지를 알기 위해서 진행해보려고 한다. buf를 재설정하기 memset(buf, 0, BUF_LEN); 이런식으로 아무때나 밀어도 되고 char buf[BUF_LEN] = {0,}; 설정할때 밀어도 된다 for (int i = recv_len; i < BUF_LEN; i++) { buf[i] = '\0'; } 아니면 원하는 조건대로 밀어도 된다. fgets 상황에서 buffer flush 하기 while(getchar(..
형식 지정자 C 프로그래밍 언어에서 형식 지정자는 읽거나 쓰는 데이터의 형식과 형식을 지정하기 위해 형식이 지정된 입력/출력 함수에 사용되는 특수 문자입니다. 이들은 printf(), scanf(), fprintf() 및 fscanf()와 같은 함수와 함께 사용됩니다. %d = int (정수) 정수 값을 읽거나 씁니다. %s = string (문자열) 문자열을 읽거나 씁니다. %c = char (문자) 단일 문자를 읽거나 씁니다. %f = float (실수, 0.1을 0.100000 으로 출력) 부동 소수점 값을 읽거나 씁니다. %g = float (실수, 0.1을 0.1로 출력) %e = 지수형 값을 읽거나 씁니다. %o = 8진수 값을 읽거나 씁니다. %x = 16진수 값을 읽거나 씁니다. %p = ..
\n 처리. fgets은 \n까지 저장하는 친구이기 때문이다. 그래서 이를 처리해주고 넘어가야한다. int main (void){ char end[16]; fputs("메시지 입력 : ", stdout); fgets(end, 16, stdin); printf("%d\n", (int)strlen(end)); end[strlen(end)-1] = '\0'; printf("%d\n", (int)strlen(end)); printf("%d\n", strcmp(end, "123")); } Strcmp int strcmp(const char *s1, const char *s2); 두 문자열이 [완전히] 일치하는지 확인하는 함수. 아닌경우 틀린 코드끼리의 아스키값 차이를 반환한다. fget char *fgets(ch..