C에서 bzero 함수 사용

Jinku Hu 2023년10월12일
  1. bzero함수를 사용하여 C의 메모리 영역을 제로화
  2. explicit_bzero함수를 사용하여 C에서 메모리 영역 제로화
  3. memset함수를 사용하여 C에서 메모리 영역을 제로화
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);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - C Memory