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);
}
- 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);
}
}