C에서 bzero 함수 사용
이 기사는 C에서bzero
함수를 사용하는 방법에 대한 여러 가지 방법을 보여줍니다.
bzero
함수를 사용하여 C의 메모리 영역을 제로화
메모리 관리는 사용자가 기본 메모리 구조와 상호 작용하고 이에 대해 작동해야하기 때문에 C 프로그래밍의 핵심 작업 중 하나입니다. 따라서 메모리 영역을 비우는 것은 많은 시나리오에서 사용되는 일반적인 작업입니다. 때로는 동적 메모리를 0으로 덮어 써야 가비지 값에서 지워야합니다. 때때로 멤버의 초기화 전에 명시 적으로 제로화해야하는 여러 비트 마스크 값을 포함하는struct
가 있습니다. 이 예제에서는 나중에 주어진 소켓에 바인딩하는 데 사용되는 소켓 주소 구조를 0으로 만드는 코드를 보여줍니다. bzero
기능을 사용하여 0 바이트 (\0
)로 지정된 메모리 영역을 지울 수 있습니다. 두 개의 인수, 즉 메모리 영역의 시작 주소와 제로화해야하는 바이트 수를 사용합니다.
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/socket.h"
#include "sys/un.h"
#include "unistd.h"
const char *SOCKNAME = "/tmp/mysocket";
int main(int argc, char *argv[]) {
int sfd;
struct sockaddr_un addr;
sfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sfd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
bzero(&addr, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SOCKNAME, sizeof(addr.sun_path) - 1);
if (bind(sfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
if (close(sfd) == -1) {
perror("close");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
explicit_bzero
함수를 사용하여 C에서 메모리 영역 제로화
메모리 영역을 0으로 덮어 쓰는 또 다른 방법은explicit_bzero
함수를 사용하는 것입니다. bzero
함수와 달리explicit_bzero
는 컴파일러 최적화에서 함수가불필요한
것으로 추론하더라도 메모리 영역을 덮어 쓰도록 보장합니다. 이 함수는 C 언어의 비표준 확장이며 일부 컴파일러에 포함되지 않을 수 있습니다.
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/socket.h"
#include "sys/un.h"
#include "unistd.h"
const char *SOCKNAME = "/tmp/mysocket";
int main(int argc, char *argv[]) {
int sfd;
struct sockaddr_un addr;
sfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sfd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
explicit_bzero(&addr, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SOCKNAME, sizeof(addr.sun_path) - 1);
if (bind(sfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
if (close(sfd) == -1) {
perror("close");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
memset
함수를 사용하여 C에서 메모리 영역을 제로화
memset
은 표준 C 라이브러리의 일부이며이 세 함수 사이의 대부분의 시나리오에서 권장되는 방법이기도합니다. bzero
는 감가 상각 된 함수이며 최신 코드베이스에서 사용해서는 안됩니다. 그러나memset
연산은explicit_bzero
와는 반대로 컴파일러에 의해 최적화 될 수 있습니다.
memset
은 세 가지 인수를 사용합니다.
- 메모리 주소.
- 메모리를 채울 상수 바이트.
- 덮어 쓸 바이트 수입니다.
memset
은 메모리 영역에 대한 포인터를 반환하며 연결된 함수 호출에 사용할 수 있습니다.
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/socket.h"
#include "sys/un.h"
#include "unistd.h"
const char *SOCKNAME = "/tmp/mysocket4";
int main(int argc, char *argv[]) {
int sfd;
struct sockaddr_un addr;
sfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sfd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
memset(&addr, 0, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SOCKNAME, sizeof(addr.sun_path) - 1);
if (bind(sfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
if (close(sfd) == -1) {
perror("close");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook