pipe - hochan222/Everything-in-JavaScript GitHub Wiki
νμ΄νλ λ νλ‘μΈμ€ μ¬μ΄μμ ν λ°©ν₯μΌλ‘ ν΅μ ν μ μλλ‘ μ§μν©λλ€. μμμ | κΈ°νΈλ νμ΄νλ₯Ό μλ―Έν©λλ€. μμμ νμ΄ν κΈ°λ₯μ ν λͺ λ Ήμ νμ€ μΆλ ₯μ λ€μ λͺ λ Ήμμ νμ€ μ λ ₯μ λ°μ μννλ κ²μ μλ―Έν©λλ€.
μλ₯Όλ€μ΄,
# grep pipe test.c | more
μμ μλ λͺ λ ΉμΈ grep pipe test.cμ νμ€ μΆλ ₯μ λ€μ λͺ λ ΉμΈ moreμ νμ€ μ λ ₯μΌλ‘ μ¬μ©ν©λλ€. μ μλ₯Ό μ€ννλ©΄ test.cμμ "pipe"λΌλ λ¬Έμμ΄μ΄ μμΉν νμ μ°Ύμ νλ©΄ λ¨μλ‘ μΆλ ₯(more)ν©λλ€. νμ΄νλ μ΄λ¦μλ νμ΄ν(μ΅λͺ νμ΄ν:anonymouse pipe)μ (μ΄λ¦ μλ νμ΄ν:named pipe)λ‘ κ΅¬λΆλ©λλ€.
μ΄λ¦ μλ νμ΄ν : pipe
νΉλ³ν μμμ΄ μμ΄ κ·Έλ₯ νμ΄νλΌκ³ νλ©΄ μΌλ°μ μΌλ‘ μ΄λ¦ μλ νμ΄ν(μ΅λͺ νμ΄ν)λ₯Ό μλ―Έν©λλ€. μ΄λ¦ μλ νμ΄νλ λΆλͺ¨-μμ νλ‘μΈμ€ κ°μ ν΅μ ν μ μκ² ν΄μ€λλ€. λΆλͺ¨ νλ‘μΈμ€μμ fork ν¨μλ₯Ό ν΅ν΄ μμ νλ‘μΈμ€λ₯Ό μμ±νκ³ , λΆλͺ¨ νλ‘μΈμ€μ μμ νλ‘μΈμ€ κ°μ ν΅μ νλ κ²μ λλ€. λ°λΌμ λΆλͺ¨ νλ‘μΈμ€ β μμ νλ‘μΈμ€ λλ μμ νλ‘μΈμ€ β λΆλͺ¨ νλ‘μΈμ€ μ€ ν λ°©ν₯μ μ νν΄μΌ ν©λλ€. νμ΄νλ₯Ό μ΄μ©ν΄ μλ°©ν₯ ν΅μ μ μν κ²½μ° νμ΄νλ₯Ό λ κ° μμ±ν΄μΌ ν©λλ€.
κ°λ¨ν νμ΄ν μμ±: FILE *popen(const char *command, const char *mode); int pclose(FILE *stream);
볡μ‘ν νμ΄ν μμ±: int pipe(int fildes[2]);
μ΄λ¦ μλ νμ΄ν : FIFO
λΆλͺ¨-μμ νλ‘μΈμ€ κ΄κ³κ° μλ λ 립μ μΈ νλ‘μΈμ€λ€μ΄ νμ΄νλ₯Ό μ΄μ©νλ €λ©΄ νμΌμ²λΌ μ΄λ¦μ΄ μμ΄μΌ ν©λλ€. μ΄λ κ² μ΄λ¦μλ νμ΄νλ νΉμ νμΌμ ν μ’ λ₯λ‘, FIFOλΌκ³ λ ν©λλ€. λͺ¨λ νλ‘μΈμ€κ° μ΄λ¦ μλ νμ΄νλ₯Ό μ΄μ©ν΄ ν΅μ ν μ μμ΅λλ€. μ΄λ¦ μλ νμ΄ν κ΄λ ¨ λͺ λ Ήκ³Ό ν¨μλ μλ νμ κ°μ΅λλ€.
FIFO μμ± λͺ
λ Ή: mknod name p mkfifo [-m mode] path...
FIFO μμ± ν¨μ: int mknod(const char *path, mode_t mode, dev_t dev); int mkfifo(const char *path, mode_t mode);
01. μ΄λ¦ μλ νμ΄ν
νμ΄νλ λ νλ‘μΈμ€ κ°μ ν΅μ μ ν μ μλλ‘ μΈν°νμ΄μ€λ₯Ό μ 곡ν©λλ€. μ무 μμμ΄ μμ΄ κ·Έλ₯ νμ΄νλΌκ³ νλ©΄ μΌλ°μ μΌλ‘ μ΄λ¦ μλ νμ΄ν(μ΅λͺ νμ΄ν:anonymous pipe)λ₯Ό μλ―Έν©λλ€. μ΄λ¦ μλ νμ΄νλ λΆλͺ¨-μμ νλ‘μΈμ€ κ°μ ν΅μ μ ν μ μκ² ν΄μ€λλ€. λΆλͺ¨ νλ‘μΈμ€μμ fork ν¨μλ₯Ό μ¬μ©ν΄ μμ νλ‘μΈμ€λ₯Ό μμ±νκ³ , λΆλͺ¨ νλ‘μΈμ€μ μμ νλ‘μΈμ€ κ°μ ν΅μ νλ κ²μ λλ€.
νμ΄νλ κΈ°λ³Έμ μΌλ‘ λ¨λ°©ν₯μ λλ€. λ°λΌμ λΆλͺ¨ νλ‘μΈμ€κ° μΆλ ₯ν λ΄μ©μ μμ νλ‘μΈμ€μμ μ½μ κ²μΈμ§, μμ νλ‘μΈμ€κ° μΆλ ₯ν λ΄μ©μ λΆλͺ¨ νλ‘μΈμ€μμ μ½μ κ²μΈμ§ λ μ€ ν λ°©ν₯μ μ νν΄μΌ ν©λλ€. μ΄λ μλκ΄μ λ¬Όμ λ³΄λΌ λ μμͺ½μμ μλ‘ λ³΄λΌ μ μλ κ²κ³Ό κ°μ μ΄μΉμ λλ€. μ΄ μ μμλ νμ΄ν κ΄λ ¨ ν¨μμΈ popen, pclose, pipe ν¨μλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
κ°λ¨ν νμ΄ν μμ±
νμ΄νλ₯Ό λ§λλ κ°μ₯ κ°λ¨ν λ°©λ²μ popen ν¨μλ₯Ό μ¬μ©νλ κ²μ λλ€. μ¬μ©μ λ§μΉ νμ΄νλ pclose ν¨μλ₯Ό μ¬μ©ν΄ λ«μ΅λλ€.
νμ΄ν μμ±: pipen(3)
#include <stdio.h>
FILE *popen(const char *command, const char *mode);
popen ν¨μλ λ€λ₯Έ νλ‘μΈμ€μ ν΅μ νκΈ° μν΄ νμ΄νλ₯Ό μμ±ν©λλ€. 첫λ²μ§Έ μΈμμΈ commandμλ μ λͺ λ Ήμ, λλ²μ§Έ μΈμμΈ modeμλ "r"μ΄λ "w"λ₯Ό μ§μ ν©λλ€. "r"μ νμ΄νλ₯Ό μ½κΈ° μ μ©μΌλ‘, "w"λ μ°κΈ° μ μ©μΌλ‘ μ½λλ€. popen ν¨μλ λ΄λΆμ μΌλ‘ fork ν¨μλ₯Ό μ€νν΄ μμ νλ‘μΈμ€λ₯Ό λ§λ€κ³ commandμμ μ§μ ν λͺ λ Ήμ exec ν¨μλ‘ μ€νν΄ μμ νλ‘μΈμ€κ° μννλλ‘ ν©λλ€. μμ νλ‘μΈμ€κ° μ€ννλ exec ν¨μλ λ€μκ³Ό κ°μ ννκ° λ©λλ€.
execl("/usr/bin/sh", "sh", "-c", command, (char *)0);
popen ν¨μλ μμ νλ‘μΈμ€μ νμ΄νλ₯Ό λ§λ€κ³ modeμ κ°μ λ°λΌ νμ€ μ μΆλ ₯μ μ°κ²°ν©λλ€. 리ν΄κ°μ νμΌ ν¬μΈν°μ λλ€. νμΌ μ μΆλ ₯ ν¨μμμ μ΄ νμΌ ν¬μΈν°λ₯Ό μ¬μ©νλ©΄ νμ΄νλ₯Ό μ½κ±°λ μΈ μ μμ΅λλ€. popen ν¨μλ νμ΄ν μμ±μ μ€ν¨νλ©΄ λ ν¬μΈν°λ₯Ό 리ν΄ν©λλ€.
νμ΄ν λ«κΈ°: pclose(3)
#include <stdio.h>
int pclose(FILE *stream);
pclose ν¨μλ νμΌ μ μΆλ ₯ ν¨μμ²λΌ μΈμλ‘ μ§μ ν νμ΄νλ₯Ό λ«μ΅λλ€. pclose ν¨μλ κ΄λ ¨λ waitpid ν¨μλ₯Ό μννλ©° μμ νλ‘μΈμ€λ€μ΄ μ’ λ£νκΈ°λ₯Ό κΈ°λ€λ Έλ€κ° 리ν΄ν©λλ€. pclose ν¨μμ 리ν΄κ°μ μμ νλ‘μΈμ€μ μ’ λ£ μνμ λλ€. μ΄ ν¨μλ νμ΄νλ₯Ό λ«λλ° μ€ν¨νλ©΄ -1μ 리ν΄ν©λλ€.
popen ν¨μ(μ°κΈ° μ μ© λͺ¨λ)λ₯Ό μ¬μ©ν΄ νμ΄νλ₯Ό μμ±ν΄λ³΄κ² μ΅λλ€.
#include <stdlib.h>
#include <stdio.h>
int main(void) {
FILE *fp;
int a;
fp = popen("wc -l", "w");
if(fp == NULL) {
fprintf(stderr, "popen failed\n");
exit(1);
}
for(a=0; a<100; a++)
fprintf(fp, "test line\n");
pclose(fp);
return 0;
}
μ΄λ²μλ popen ν¨μ(μ½κΈ° μ μ© λͺ¨λ)λ₯Ό μ¬μ©ν΄ νμ΄νλ₯Ό μμ±ν΄λ³΄κ² μ΅λλ€. μμ νλ‘μΈμ€κ° νμ΄νμ κΈ°λ‘ν λ°μ΄ν°λ₯Ό λΆλͺ¨ νλ‘μΈμ€κ° μ½μ΄μ μ²λ¦¬νκ² μ΅λλ€.
#include <stdlib.h>
#include <stdio.h>
int main(void) {
FILE *fp;
char buf[256];
fp = popen("date", "r"); // μμ νλ‘μΈμ€μμλ date λͺ
λ Ήμ μν.
if(fp == NULL) {
fprintf(stderr, "popen failed\n");
exit(1);
}
// λΆλͺ¨ νλ‘μΈμ€μμλ 14νμμ μμ νλ‘μΈμ€κ° κΈ°λ‘ν λ°μ΄ν°λ₯Ό μ½κ³
// μ μ₯ν΄ 20νμμ μΆλ ₯νλ€.
if(fgets(buf, sizeof(buf), fp) == NULL) {
fprintf(stderr, "No data from pipe!\n");
exit(1);
}
printf("line : %s\n", buf);
pclose(fp);
return 0;
}
볡μ‘ν νμ΄ν μμ±
SYSTEM CALL: pipe();
PROTOTYPE: int pipe(int fd[2]);
RETURNS: μ±κ³΅μ 0
-1 on error: errno = EMFILE (μμ λ‘μ΄ μλ³μκ° μλ€)
EMFILE (μμ€ν
νμΌ ν
μ΄λΈμ΄ λ€ μ°Όλ€)
EFAULT (fd λ°°μ΄μ΄ μ ν¨νμ§ μλ€)
NOTES: fd[0]λ μ½κΈ°λ₯Ό μν΄ μ€λΉλκ³ , fd[1]μ μ°κΈ°λ₯Ό μν΄ μ€λΉλλ€.
popen ν¨μλ₯Ό μ¬μ©ν΄ νμ΄νλ₯Ό μμ±νλ μΌμ κ°λ¨νμ§λ§, μμ μ€νν΄μΌ νλ―λ‘ λΉν¨μ¨μ μ΄κ³ μ£Όκ³ λ°μ μ μλ λ°μ΄ν°λ μ νμ μ λλ€. popen ν¨μ λμ μ pipe ν¨μλ₯Ό μ¬μ©νλ©΄ κ³Όμ μ΄ μ½κ° 볡μ‘ν΄μ§μ§λ§ νμ΄νλ₯Ό μ’ λ ν¨μ¨μ μΌλ‘ μμ±ν μ μμ΅λλ€.
νμ΄ν λ§λ€κΈ°: pipe(2)
#include <unistd.h>
int pipe(int fildes[2]);
pipe ν¨μλ μΈμλ‘ ν¬κΈ°κ° 2μΈ μ μν λ°°μ΄μ λ°μ΅λλ€. pipe ν¨μλ μ΄ λ°°μ΄μ νμΌ κΈ°μ μ 2κ°λ₯Ό μ μ₯ν©λλ€. fildes[0]μ μ½κΈ° μ μ©μΌλ‘ μ΄κ³ , fildes[1]μ μ°κΈ° μ μ©μΌλ‘ μ½λλ€. pipe ν¨μλ νμ΄νλ₯Ό μμ±νλ λ° μ±κ³΅νλ©΄ 0μ, μ€ν¨νλ©΄ -1μ 리ν΄ν©λλ€.
pipe ν¨μλ‘ ν΅μ νλ κ³Όμ
μ¬κΈ°μλ pipe ν¨μλ‘ μμ±ν νμ΄νλ‘ ν΅μ νλ κ³Όμ μ μ΄ν΄λ³΄κ² μ΅λλ€. νμ΄νλ₯Ό μμ±νκ³ λλ©΄ μΌλ°μ μΌλ‘ fork ν¨μλ₯Ό νΈμΆν΄ μμ νλ‘μΈμ€λ₯Ό μμ±ν©λλ€. μμ νλ‘μΈμ€λ λΆλͺ¨ νλ‘μΈμ€κ° pipe ν¨μλ‘ μμ±ν νμΌ κΈ°μ μλ€λ 볡μ¬ν©λλ€. μ΄ νμ΄νλ₯Ό μ΄μ©ν΄ ν νλ‘μΈμ€μμλ μ°κΈ°λ₯Ό μννκ³ , λ€λ₯Έ νλ‘μΈμ€μμλ μ½κΈ°λ₯Ό μννλ©΄ ν΅μ μ΄ λλ κ²μ λλ€. μ΄ κ³Όμ μ λ¨κ³μ μΌλ‘ μ΄ν΄λ³΄κ² μ΅λλ€.
β pipe ν¨μλ₯Ό νΈμΆν΄ νμ΄νμ μ¬μ©ν νμΌ κΈ°μ μλ₯Ό μ»λλ€. νμ΄νλ νμΌμ μΌμ’ μ΄λ―λ‘ νμΌ(νμ΄ν)μ μ½κ³ μΈ μ μλ νμΌ κΈ°μ μκ° νμνλ°, μ΄λ₯Ό pipe ν¨μκ° μμ±ν΄μ£Όλ κ²μ΄λ€. μλ κ·Έλ¦Όκ³Ό κ°μ΄ νλ‘μΈμ€μ fd[0]κ³Ό fd[1]μ΄ μμ±λλ€.
β‘ fork ν¨μλ₯Ό μνν΄ μμ νλ‘μΈμ€λ₯Ό μμ±νλ€. μ΄λ pipe ν¨μμμ μμ±ν νμΌ κΈ°μ μλ μμ νλ‘μΈμ€λ‘ 볡μ¬λλ€. μλμμ 보λ κ²μ²λΌ κ°μ νμΌ κΈ°μ μλ₯Ό λΆλͺ¨ νλ‘μΈμ€μ μμ νλ‘μΈμ€κ° λͺ¨λ κ°μ§κ³ μκ² λλ κ²μ΄λ€.
β’ νμ΄νλ λ¨λ°©ν₯ ν΅μ μ΄λ―λ‘ ν΅μ λ°©ν₯μ κ²°μ νλ€. μλ₯Ό λ€μ΄, λΆλͺ¨ νλ‘μΈμ€λ μ°κΈ°λ₯Ό νκ³ μμ νλ‘μΈμ€λ μ½κΈ°λ₯Ό νλ€κ³ κ°μ νμ. κ·Έλ¬λ©΄ μμ νλ‘μΈμ€λ μ½κΈ°λ§ ν κ²μ΄λ―λ‘ μ°κΈ°μ© νμΌ κΈ°μ μμΈ fd[1]μ λ«λλ€. λ°λλ‘ λΆλͺ¨ νλ‘μΈμ€λ μ°κΈ°λ§ ν κ²μ΄λ―λ‘ μ½κΈ°μ© νμΌ κΈ°μ μμΈ fd[0]μ λ«λλ€. μλμ κ°μ΄ λΆλͺ¨ νλ‘μΈμ€μμ μμ νλ‘μΈμ€λ‘ ν΅μ ν μ μλλ‘ νμΌ κΈ°μ μλ€μ΄ μ 리λμλ€. μ΄μ λΆλͺ¨ νλ‘μΈμ€κ° fd[1]μ μ΄ λ΄μ©μ μμ νλ‘μΈμ€κ° fd[0]μμ μ½μΌλ©΄ λλ€.
λ§μ½ νμ΄νμ μ°κΈ° λΆλΆμ΄ λ«ν μλ€λ©΄ νμ΄νμμ μ½μΌλ €κ³ ν λ 0μ΄λ EOFκ° λ¦¬ν΄λ©λλ€. νμ΄νμ μ½κΈ° λΆλΆμ΄ λ«ν μλ€λ©΄ νμ΄νμ μ°λ €κ³ ν λ SIGPIPE μκ·Έλμ΄ λ°μν©λλ€.
νμ΄νλ₯Ό μμ±ν ν fork ν¨μλ‘ μμ νλ‘μΈμ€λ₯Ό μμ±ν΄ νμ΄νλ‘ λΆλͺ¨-μμ νλ‘μΈμ€λ₯Ό μ°κ²°νκ³ , λΆλͺ¨ νλ‘μΈμ€κ° νμ΄νμ μΆλ ₯ν λ¬Έμμ΄μ μμ νλ‘μΈμ€κ° νμ΄νμμ μ½μ΄λ€μ΄λ νλ‘κ·Έλ¨μ λ§λ€μ΄λ³΄κ² μ΅λλ€.
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int fd[2];
pid_t pid;
char buf[257];
int len, status;
if(pipe(fd) == -1) { // pipe ν¨μλ₯Ό μ¬μ©ν΄ νμ΄νλ₯Ό μμ±νλ€. pipe ν¨μμ μΈμλ‘λ νμΌ κΈ°μ μλ₯Ό μ μ₯ν λ°°μ΄μ μ§μ νλ€.
perror("pipe");
exit(1);
}
switch(pid = fork()) { // fork ν¨μλ₯Ό μ¬μ©ν΄ μμ νλ‘μΈμ€λ₯Ό μμ±νλ€.
case -1:
perror("fork");
exit(1);
break;
// μμ νλ‘μΈμ€μ λμ λΆλΆμ΄λ€. 24νμμ fd[1]μ λ«λλ€. μ΄λ μμ νλ‘μΈμ€μμ
// νμ΄νλ₯Ό μ½κΈ°μ©μΌλ‘ μ¬μ©νκ² λ€λ μλ―Έλ€. 27νμμ νμ΄νμ μ
λ ₯ λΆλΆμΈ fd[0]μμ
// λ¬Έμμ΄μ μ½μ΄λ€μΈλ€.
case 0: /* child */
close(fd[1]);
write(1, "Child Process:", 15);
len = read(fd[0], buf, 256);
write(1, buf, len);
close(fd[0]);
break;
// λΆλͺ¨ νλ‘μΈμ€μ λμ λΆλΆμ΄λ€. 34νμμ fd[0]μ λ«λλ€. μ΄λ νμ΄νλ₯Ό
// μΆλ ₯μ©μΌλ‘ μ¬μ©νκ² λ€λ μλ―Έλ€. 37νμμ fd[1]λ‘ λ¬Έμμ΄μ μΆλ ₯νλ€.
default:
close(fd[0]);
buf[0] = '\0';
write(fd[1], "Test Message\n", 14);
close(fd[1]);
waitpid(pid, &status, 0);
break;
}
return 0;
}
μ΄λ²μλ μμμ λ§μ΄ μ¬μ©νλ λͺ λ Ή ννμΈ ps -ef | grep telnetμ λμμ ꡬνν΄λ³΄λλ‘ νκ² μ΅λλ€.
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int fd[2];
pid_t pid;
if(pipe(fd) == -1) { // νμ΄νλ₯Ό μμ±νλ€.
perror("pipe");
exit(1);
}
// fork ν¨μλ₯Ό μ¬μ©ν΄ μμ νλ‘μΈμ€λ₯Ό μμ±νλ€. pas λͺ
λ Ήμ κ²°κ³Όλ
// κΈ°λ³ΈμΌλ‘ νμ€ μΆλ ₯μΌλ‘ μΆλ ₯λκ³ , grep λͺ
λ Ήμ νμ€ μ
λ ₯μ ν΅ν΄
// μ
λ ₯λ°λλ€. λ°λΌμ λΆλͺ¨ νλ‘μΈμ€μ μμ νλ‘μΈμ€ κ°μ ν΅μ μ΄
// νμ€ μ
μΆλ ₯ λμ νμ΄νλ₯Ό ν΅ν΄ μ΄λ£¨μ΄μ§λλ‘ λ§λ€μ΄μΌ νλ€.
switch(pid = fork()) {
case -1:
perror("fork");
exit(1);
break;
case 0: /* child */
// μμ νλ‘μΈμ€κ° ν΄μΌ ν μΌμ λΆλͺ¨ νλ‘μΈμ€κ° νμ΄νλ‘ μΆλ ₯νλ
// ps -ef λͺ
λ Ήμ κ²°κ³Όλ₯Ό λ°μ grep telnet λͺ
λ Ήμ μννλ κ²μ΄λ€.
// λ°λΌμ νμ΄νμ μΆλ ₯ λΆλΆμ΄ νμμμΌλ―λ‘ fd[1]μ λ«λλ€.
close(fd[1]); // μ½κΈ°μ©μΌλ‘ μ¬μ©
// fd[0]μ κ°μ΄ 0μ΄ μλλ©΄, μ¦ νμ€ μ
λ ₯μ΄ μλλ©΄ fd[0]μ κ°μ
// νμ€ μ
λ ₯μΌλ‘ λ³΅μ¬ ν ν fd[0]μ λ«λλ€. μ΄μ μμ νλ‘μΈμ€μμλ
// νμ€ μ
λ ₯μ fd[0]μ΄ κ°λ¦¬ν€λ νμ΄νμμ μ½λλ€.
if(fd[0] != 0) {
dup2(fd[0], 0);
close(fd[0]);
}
// μμ νλ‘μΈμ€κ° grep λͺ
λ Ήμ exec ν¨μλ‘ νΈμΆνλ€. μ΄λ κ² νλ©΄ grep λͺ
λ Ήμ
// νμ€ μ
λ ₯μ ν΅ν΄ λ°μ΄ν°λ₯Ό μ½μ΄λ€μ΄λ € νλ€. μ΄λ―Έ μμͺ½μ νμ€ μ
λ ₯μΌλ‘ νμ΄νμ
// μ
λ ₯ νμΌ κΈ°μ μλ₯Ό 볡μ¬νμΌλ―λ‘ κ²°κ³Όμ μΌλ‘ νμ΄νλ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό μ½μ΄λ€μΈλ€.
execlp("grep", "grep", "telnet", (char *)NULL);
exit(1);
break;
default:
// λΆλͺ¨ νλ‘μΈμ€μ λμμ μ΄ν΄λ³΄λ©΄ μμ νλ‘μΈμ€μ ν¬κ² λ€λ₯Ό κ²μ΄ μμμ μ μ μλ€.
// μ°μ νμ΄νμ μ
λ ₯ λΆλΆμ΄ νμ μμΌλ―λ‘ λ«λλ€.
close(fd[0]);
// νμ΄νμ μΆλ ₯ λΆλΆμ νμ€ μΆλ ₯μΌλ‘ 볡μ¬νλ€. λ°λΌμ λΆλͺ¨ νλ‘μΈμ€μμ
// 무μΈκ°λ₯Ό μΆλ ₯νλ©΄, νμ΄νλ₯Ό ν΅ν΄ μΆλ ₯λλ€.
if(fd[1] != 1) {
dup2(fd[1], 1);
close(fd[1]);
}
// exec ν¨μλ₯Ό μ¬μ©ν΄ ps -ef λͺ
λ Ήμ μ€ννλ€. ps -efμ λͺ
λ Ήμ κΈ°λ³ΈμΌλ‘ νμ€ μΆλ ₯μΌλ‘
// μΆλ ₯νλ―λ‘ κ²°κ³Όκ° νμ΄νλ‘ μΆλ ₯λλ€. μ΄ μΆλ ₯ κ²°κ³Όλ₯Ό μμ νλ‘μΈμ€κ° μ½μ΄ λ€μΈλ€.
execlp("ps", "ps", "-ef", (char *)NULL);
wait(NULL);
break;
}
return 0;
}
μλ°©ν₯ νμ΄νμ νμ©
νμ΄νλ κΈ°λ³Έμ μΌλ‘ λ¨λ°©ν₯ ν΅μ μ μννλ€κ³ νμ΅λλ€. λ°λΌμ νμ΄νλ₯Ό μ΄μ©ν΄ μλ°©ν₯ ν΅μ μ νλ €λ©΄ νμ΄νλ₯Ό λ κ° μμ±νλ©΄ λ©λλ€. μμλμ νμλκ° κ°κ° λ³λμ νμ΄νλ‘ κ΅¬μ±λμ΄ μλ κ²κ³Ό κ°μ μ΄μΉμ λλ€. μμ λ₯Ό ν΅ν΄ μλ°©ν₯ νμ΄νλ₯Ό νμ©νλ λ°©λ²μ μμλ³΄κ² μ΅λλ€.
λ€μμ νμ΄ν λκ°λ₯Ό μμ±ν΄ λΆλͺ¨ νλ‘μΈμ€μ μμ νλ‘μΈμ€ κ°μ μλ°©ν₯ ν΅μ μ μννλ μμ μ λλ€.
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void) {
int fd1[2], fd2[2];
pid_t pid;
char buf[257];
int len, status;
// νμ΄νλ₯Ό νλ μμ±νλ€. μμ±λ νμΌ κΈ°μ μ fd1μ λΆλͺ¨ νλ‘μΈμ€μμ
// μμ νλ‘μΈμ€λ‘ λ°μ΄ν°λ₯Ό 보λΌλ μ¬μ©νλ€.
if(pipe(fd1) == -1) {
perror("pipe");
exit(1);
}
// λ λ€λ₯Έ νμ΄νλ₯Ό μμ±νλ€. νμΌ κΈ°μ μ fd2λ μμ νλ‘μΈμ€μμ
// λΆλͺ¨ νλ‘μΈμ€λ‘ λ°μ΄ν°λ₯Ό 보λΌλ μ¬μ©νλ€.
if(pipe(fd2) == -1) {
perror("pipe");
exit(1);
}
switch(pid = fork()) {
case -1:
perror("fork");
exit(1);
break;
// μμ νλ‘μΈμ€λ λΆλͺ¨ νλ‘μΈμ€μμ μ€λ λ°μ΄ν°λ₯Ό μ½λ λ° μ¬μ©ν
// fd1[0]μ λ¨κ²¨λκ³ fd1[1]μ λ«λλ€. λν λΆλͺ¨ νλ‘μΈμ€λ‘ λ°μ΄ν°λ₯Ό 보λ΄λλ°
// μ¬μ©ν fd2[1]μ λ¨κ²¨λκ³ fd2[0]μ λ«λλ€.
case 0: /* child */
close(fd1[1]);
close(fd2[0]);
write(1, "Child Process:", 15);
len = read(fd1[0], buf, 256); // λΆλͺ¨νλ‘μΈμ€λ‘ λΆν° μ½μ΄μ¨λ€.
write(1, buf, len);
strcpy(buf, "Good\n");
write(fd2[1], buf, strlen(buf)); //μμ νλ‘μΈμ€κ° λΆλͺ¨μκ²
break;
// λΆλͺ¨ νλ‘μΈμ€λ μμ νλ‘μΈμ€μ λ°λλ€. μμ νλ‘μΈμ€μ λ°μ΄ν°λ₯Ό 보λ΄λλ° μ¬μ©ν fd[1]μ
// λ¨κ²¨λκ³ , μμ νλ‘μΈμ€μμ μ€λ λ°μ΄ν°λ₯Ό μ½λ λ° μ¬μ©ν fd2[0]μ λ¨κ²¨λλ€.
default:
close(fd1[0]);
close(fd2[1]);
buf[0] = '\0';
write(fd1[1], "Hello\n", 6); // λΆλͺ¨νλ‘μΈμ€κ° μμ νλ‘μΈμ€μκ²
sleep(2);
write(1, "Parent Process:", 15);
len = read(fd2[0], buf, 256); //μμνλ‘μΈμ€λ‘λΆν° μ½μ΄μ¨λ€.
write(1, buf, len);
waitpid(pid, &status, 0);
break;
}
return 0;
}