Copy 코드 분석

int main(int argc, char *argv[])
{
    int inputFd, outputFd, openFlags;
    mode_t filePerms;
    ssize_t numRead;
    char buf[BUF_SIZE];

    // argc와 argv를 사용해 프로그램에 전달된 명령행 인수를 확인합니다.
    // 매개변수가 3개가 아닐 경우 에러메시지 출력
    if (argc != 3 || strcmp(argv[1], "--help") == 0)
        usageErr("%s old-file new-file\n", argv[0]);

    // 첫 번째 파일을 읽기 전용으로 엽니다.
    // -1(에러시 파일 종료)
    inputFd = open(argv[1], O_RDONLY);
    if (inputFd == -1)
        errExit("opening file %s", argv[1]);

    // 두 번째 파일을 쓰기 전용으로 엽니다.
    
    openFlags = O_CREAT | O_WRONLY | O_TRUNC;
    filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP |
                S_IROTH | S_IWOTH;      /* rw-rw-rw- */
    outputFd = open(argv[2], openFlags, filePerms);
    if (outputFd == -1)
        errExit("opening file %s", argv[2]);

    // 첫 번째 파일에서 데이터를 읽어 두 번째 파일로 쓰는 루프를 실행합니다.
    // 예를들어 numRead가 10이거 buf가 3이면 numRead는 3씩 줄어듭니다.
    while ((numRead = read(inputFd, buf, BUF_SIZE)) > 0)
        if (write(outputFd, buf, numRead) != numRead)
            fatal("write() returned error or partial write occurred");

    // read() 함수에서 발생한 오류를 처리합니다.
    if (numRead == -1)
        errExit("read");

    // 열린 파일 디스크립터를 닫습니다.
    if (close(inputFd) == -1)
        errExit("close input");
    if (close(outputFd) == -1)
        errExit("close output");

    exit(EXIT_SUCCESS);
}

fork

int main(int argc, char *argv[])
{
    int inputFd, outputFd, openFlags;
    mode_t filePerms;
    ssize_t numRead;
    char buf[BUF_SIZE];

    // argc와 argv를 사용해 프로그램에 전달된 명령행 인수를 확인합니다.
    // 매개변수가 3개가 아닐 경우 에러메시지 출력
    if (argc != 3 || strcmp(argv[1], "--help") == 0)
        usageErr("%s old-file new-file\n", argv[0]);

    // 첫 번째 파일을 읽기 전용으로 엽니다.
    // -1(에러시 파일 종료)
    inputFd = open(argv[1], O_RDONLY);
    if (inputFd == -1)
        errExit("opening file %s", argv[1]);

    // 두 번째 파일을 쓰기 전용으로 엽니다.
    
    openFlags = O_CREAT | O_WRONLY | O_TRUNC;
    filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP |
                S_IROTH | S_IWOTH;      /* rw-rw-rw- */
    outputFd = open(argv[2], openFlags, filePerms);
    if (outputFd == -1)
        errExit("opening file %s", argv[2]);

    // 첫 번째 파일에서 데이터를 읽어 두 번째 파일로 쓰는 루프를 실행합니다.
    // 예를들어 numRead가 10이거 buf가 3이면 numRead는 3씩 줄어듭니다.
    while ((numRead = read(inputFd, buf, BUF_SIZE)) > 0)
        if (write(outputFd, buf, numRead) != numRead)
            fatal("write() returned error or partial write occurred");

    // read() 함수에서 발생한 오류를 처리합니다.
    if (numRead == -1)
        errExit("read");

    // 열린 파일 디스크립터를 닫습니다.
    if (close(inputFd) == -1)
        errExit("close input");
    if (close(outputFd) == -1)
        errExit("close output");

    exit(EXIT_SUCCESS);
}
  1. pipe
#include <stdlib.h>  // 기본 라이브러리를 위한 헤더 파일
#include "tlpi_hdr.h"  // 오류 처리 함수가 포함된 헤더 파일

int main(int argc, char *argv[]) {
  int pfd[2];             // 파이프 파일 디스크립터
  char buf[BUF_SIZE];     // 읽은 데이터를 저장할 버퍼
  ssize_t numRead;        // 읽은 바이트 수를 저장할 변수

  // 명령행 인자가 존재하지 않거나 "--help"가 인자로 주어진 경우, 사용 방법 출력
  if (argc != 2 || strcmp(argv[1], "--help") == 0)
    usageErr("%s string\n", argv[0]);

  // 파이프 생성
  if (pipe(pfd) == -1)
    errExit("pipe");

  switch (fork()) {
    case -1:  // fork 실패시
      errExit("fork");

    case 0:   // 자식 프로세스 - 파이프로부터 읽기
      // 쓰기용 파이프 닫기
      if (close(pfd[1]) == -1)
        errExit("close - child");

      // 파이프로부터 데이터를 읽어서 표준 출력으로 출력
      for (;;) {
        numRead = read(pfd[0], buf, BUF_SIZE);
        if (numRead == -1)
          errExit("read");
        if (numRead == 0)
          break;
        if (write(STDOUT_FILENO, buf, numRead) != numRead)
          fatal("child - partial/failed write");
      }

      // 줄바꿈 출력
      write(STDOUT_FILENO, "\n", 1);

      // 읽기용 파이프 닫기
      if (close(pfd[0]) == -1)
        errExit("close");

      // 자식 프로세스 종료
      exit(EXIT_SUCCESS);

    default:  // 부모 프로세스 - 파이프로 쓰기
      // 읽기용 파이프 닫기
      if (close(pfd[0]) == -1)
        errExit("close - parent");

      // 파이프로 문자열 쓰기
      if (write(pfd[1], argv[1], strlen(argv[1])) != strlen(argv[1]))
        fatal("parent - partial/failed write");

      // 쓰기용 파이프 닫기
      if (close(pfd[1]) == -1)
        errExit("close");

      // 자식 프로세스 종료를 기다림
      wait(NULL);

      // 부모 프로세스 종료
      exit(EXIT_SUCCESS);
  }
}

0개의 댓글