개발/C

· 개발/C
inline 이란 C 프로그래밍 언어에서 "인라인"은 함수가 호출되는 지점에서 함수 호출을 실제 함수 코드로 대체하도록 컴파일러에 제안하는 데 사용되는 키워드입니다. 이를 "인라인 함수 확장"이라고 합니다. C에서 함수가 정상적으로 호출되면 프로그램은 함수 코드로 점프하여 실행한 다음 다시 함수가 호출된 지점으로 돌아갑니다. 그러나 인라인 함수를 사용하면 컴파일러가 함수 호출을 실제 함수 코드로 대체하여 함수 호출의 오버헤드를 줄이고 성능을 개선하며 코 드 크기를 최적화할 수 있습니다. C 프로그래밍에서 inline 키워드는 컴파일러가 함수의 인라인 확장을 수행하도록 제안하는 데 사용됩니다. 함수가 인라인으로 선언되면 컴파일러는 함수가 호출될 때마다 함수 호출을 함수의 실제 코드로 바꾸도록 선택할 수 있..
· 개발/C
고수님들에겐 당연하고 시시한 말일수도 있지만 C언어에서 쓰레드를 예시로 어디서 지역변수 전역변수가 접근되는지 여부를 한번 보겠다. 지역변수는 쓰레드간 미공유 void entry(int a) { a = 1; } void main() { int a = 0; entry(a); printf("%d\n", a); } 출력은 0이 된다. 지역변수는 단순히 그 값을 가져왔기 때문에 전역변수는 쓰레드간 공유 # define A 0 void entry(int A) { A = 1; } void main() { entry(A); printf("%d\n", A); } 출력은 1이된다. 전역변수는 쓰레드간 공유가 된다.
· 개발/C
#include #include "chat_multi.h" #define ab(A) void (*A)() struct animal { char name[15]; ab(cry); }; void a_cry() { printf("Umm.....\n"); } void b_cry() { printf("kkkk,....\n"); } void check_animal_type(struct animal *animal) { if (!strcmp(animal->name, "a")) animal->cry = a_cry; else if (!strcmp(animal->name, "b")) animal->cry = b_cry; } void main() { struct animal animal; memset(animal.name, ..
· 개발/C
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; } ..
· 개발/C
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..
· 개발/C
포인터란 선언문과 함께 쓰인 포인터는 자료형에 불과하다. 하지만 선언문 없이 홀로 쓰인 포인터는 오른쪽 변수에 담긴 주소값에 담긴 변수로 가라는 뜻이다. 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의 변수값이 담겨있다. 다시말해 ..
· 개발/C
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..
· 개발/C
이번엔 HTTP를 통해 통신을 해보자. 도메인을 입력하면 적절한 메시지로 변환하여 서버에 쏴주고 그 대답을 듣는 내용이다. 추후엔 읽어들일때 buf length를 인식해 종말점을 계산해주는 기능을 추가하려 한다. 배운점 1. character pointer를 문자열로 바꾸는법 char *ip_char = "172.16.3.80"; char ip[IP_LEN]; for(int i = 0; i ip 구조체는 . 으로 접근해서 수정. 하지만 포인터는 . 으로 접근할수 없어서 만든것이 ->..
· 개발/C
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 은 문자열의 특정한 칸을 가리킨다. 그래서 특정 문자열을 선언하려면 이걸 써야한다.
· 개발/C
화살표의 의미 구조체를 포인터로 가져왔을 경우 . 대신 쓰는 것. #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;..
· 개발/C
지금 하는건 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
형식 지정자 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 = ..
yeonlee
'개발/C' 카테고리의 글 목록