파이프를 이용한 양방향 통신
2개의 파이프를 이용하여 부모와 자식 프로세스 사이에 양방향 통신을 할 수 있는 프로그램을 만들어봅시다.
프로그램의 동작
- 부모 프로세스는 표준 입력으로 텍스트 데이터를 받는다.
- 자신이 받은 텍스트를 파이프로 자식에게 전송한다.
- 자식은 부모가 전송한 텍스트를 받아 모든 문자를 대문자로 변경한다.
- 부모가 보낸 파이프와 다른 파이프로 부모에게 변경한 결과를 보낸다.
- 부모는 자식이 반환한 문자열을 화면에 출력하고 다시 루프에서 대기한다.
실행결과
이 프로그램은 영어 문자열을 입력했을 때, 소문자를 대문자로 바꿔준다.
#include <ctype.h>
#include <errno.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#define BUF_SIZE 1000
void fatal(const char *msg) {
perror(msg);
exit(EXIT_FAILURE);
}
int main(void) {
int fd[2];
int fd2[2];
char buf[BUF_SIZE];
ssize_t numRead, numPaRead;
if (pipe(fd) || pipe(fd2) == -1){
fatal("pipe");
}
switch (fork()) {
case -1:
fatal("fork");
case 0:
if (close(fd[1]) == -1 || close(fd2[0]) == -1)
fatal("close - child");
for (;;) {
numRead = read(fd[0], buf, BUF_SIZE);
if (numRead == -1){
fatal("child1 read");
}
if (numRead == 0){
break;
}
for (int i = 0; i < numRead; i++) {
buf[i] = toupper(buf[i]);
}
if (write(fd2[1], buf, numRead) != numRead) {
fatal("child - partial/failed write");
}
}
default:
if (close(fd[0]) == -1)
{
fatal("close - parent1");
}
if (close(fd2[1]) == -1){
fatal("close - parent2");
}
for (;;) {
fgets(buf, BUF_SIZE, stdin);
if(write(fd[1], buf, strlen(buf)) != strlen(buf)) {
fatal("parent - write");
}
numPaRead = read(fd2[0], buf, BUF_SIZE) != BUF_SIZE;
if(numPaRead == -1) {
fatal("parent - read");
}
if (numPaRead == 0) {
break;
}
printf("%s\n", buf);
}
}
return 0;
}
'C > Linux' 카테고리의 다른 글
[C] alarm 시그널을 받으면 1초 간격으로 메시지 출력하는 프로그램 구현하기 (0) | 2023.01.03 |
---|---|
[C] ctrl + c 로 종료되지 않는 프로그램 구현하기 (0) | 2023.01.03 |
[C] execve()를 사용하여 execlp() 구현하기 (0) | 2023.01.03 |
[C] chmod a+rX [path] 구현하기 (0) | 2023.01.03 |
[C] copy_file() 구현하기 (0) | 2023.01.03 |