개발

· 개발/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 = ..
· 개발/C
\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..
· 개발/C
미션 1. 실시간으로 받은 내용을 output 해보자 2. buffer 크기 이상으로 받은 내용을 output 해보자 (hint : 무조건 한번에 출력해야하는건 아니다. 나눠서 출력해도 무방) 1번은 굉장히 쉽다. 버퍼가 일을 잘해주기 때문에 그 이상의 입력값도 알아서 인식해서 뱉어준다. 그런데 어려운건 [str의 끝은 0이어야 한다]는 규칙을 지키며 깔끔하게 짜는게 어려웠다. 전체 코드는 다음과 같다. 6으로 제한을 걸어둔 상태로 그 이상도 깔끔하게 나오게 해보기 위해 노력해보았다. #include #include #include #include #include #include #include #include #include #define MSG_MAX 6 #define BUF_LEN 6 int mai..
· 개발/C
scanf() %s 는 스페이스를 끝으로 인식해 그 다음 0을 넣어 문자열을 종결시킨다. stdin/stdout을 거쳐 동작. char str[16]; printf("msg : %s", str); scanf("result is %s", str); //scanf("%[^;]s", str); 이러면 끝을 ;로 인식 fgets() 스페이스를 극복하기 위해 나왔다. stdout/stdin buffer flow로 배열포인터에 size-1개씩 \n까지 포함해 저장한다. fputs("메시지를 입력하세요 : ", stdout); fgets(message, 512, stdin); fscanf()/fprintf() file buffer로 동작 sscanf()/sprintf() string buffer로 동작. https:..
· 개발/C
미션 1. 고객의 요청을 대기중인 서버를 만들어보자 (hint. 고객의 요청을 복사하는 서버/고객 코드) https://koyo.kr/post/c-socket-example/ 이 프로젝트를 따라해보았당 block 기다리는 행위. 어디까지 진행하고 클라이언트가 접속할때까지 기다린다? 그렇다면 블락된 것. socket() 소켓은 일종의 통신창구. 객체 내 통신의 종단점. 이 서버가 다른 서버와 통신하고 싶다면 개설하는 통로. int socket(int domain, int type, int protocol); 입력 domain : 인터넷 프로토콜 결정 type : 데이터 전송 프로토콜 결정. protocol : 소켓에 특별한 프로토콜이 필요할 경우. '소통 도메인'을 지정. 출력 새 소켓의 파일디스크립터. ..
yeonlee
'개발' 카테고리의 글 목록 (3 Page)