😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ 닀쀑 처리] ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신 (IPC) with 파일 λ””μŠ€ν¬λ¦½ν„° 기반 (PIPE, FIFO) λ³Έλ¬Έ

πŸ‘©‍πŸ’» IoT (Embedded)/Raspberry Pi

[ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ 닀쀑 처리] ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신 (IPC) with 파일 λ””μŠ€ν¬λ¦½ν„° 기반 (PIPE, FIFO)

μ§•μ§•μ•ŒνŒŒμΉ΄ 2024. 1. 11. 19:02
728x90
λ°˜μ‘ν˜•

<μ„œμ˜μ§„ λ‹˜μ˜ 사물인터넷을 μœ„ν•œ λ¦¬λˆ…μŠ€ ν”„λ‘œκ·Έλž˜λ° with λΌμ¦ˆλ² λ¦¬νŒŒμ΄ μ„œμ μ„ μ°Έκ³ ν•΄μ„œ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€ :-)>

 

⭐ IPC (Inter-Process Communication)

ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신을 μœ„ν•œ 기법

 

β˜‘οΈ 파일 μ‹œμŠ€ν…œ

ν”„λ‘œμ„ΈμŠ€ 간에 버퍼 μš©λ„μ˜ μ‚¬μš©ν•  수 μžˆλŠ” νŒŒμΌμ„ μƒμ„±ν•˜κ³ , λ‹€μˆ˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ ν•œ νŒŒμΌμ„ κ²½μœ ν•˜λŠ” λ°©λ²•μœΌλ‘œ νŒŒμΌμ— μž…μΆœλ ₯ μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ„œ μ„œλ‘œ 데이터λ₯Ό κ³΅μœ ν•  수 μžˆλ‹€

 

μš΄μ˜μ²΄μ œμ— 따라 μ“°κΈ° μš©λ„λ‘œλŠ” ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ§Œ νŒŒμΌμ„ μ—΄ 수 있기 λ•Œλ¬Έμ—, μ–΄λ–€ ν”„λ‘œμ„ΈμŠ€κ°€ νŒŒμΌμ„ μ΄μš©ν•˜κ³  μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” μ ˆμ°¨κ°€ ν•„μš”ν•˜λ‹€

파일 μ‹œμŠ€ν…œμ€ μž…μΆœλ ₯ 닀쀑화 μ‹œ 문제 해결이 μ–΄λ ΅λ‹€

파일 μž…μΆœλ ₯ μ‹œ λΉˆλ²ˆν•œ μ‹œμŠ€ν…œ 호좜이 λ°œμƒν•œλ‹€

 

ꡬ뢄 λ‚΄μš©
파일 λ””μŠ€ν¬λ¦½ν„° 기반의 IPC νŒŒμ΄ν”„μ™€ FIFO(λ‹¨λ°˜ν–₯), μ†ŒμΌ“(μ–‘λ°©ν–₯)
μœ λ‹‰μŠ€ μ‹œμŠ€ν…œμ˜ V의 IPC λ©”μ‹œμ§€ 큐, μ„Έλ§ˆν¬μ–΄, 곡유 λ©”λͺ¨λ¦¬
POSIX의 IPC λ©”μ‹œμ§€ 큐, λ„€μž„λ“œ μ„Έλ§ˆν¬μ–΄, mmap(곡유 λ©”λͺ¨λ¦¬)

νŒŒμ΄ν”„λŠ” λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ™€ μžμ‹ ν”„λ‘œμ„ΈμŠ€ μ‚¬μ΄μ—μ„œλ§Œ 톡신이 κ°€λŠ₯

FIFO, μ†ŒμΌ“, λ©”μ‹œμ§€ 큐, 곡유 λ©”λͺ¨λ¦¬λŠ” μ„œλ‘œ κ΄€κ³„μ—†λŠ” ν”„λ‘œμ„ΈμŠ€ μ‚¬μ΄μ—μ„œ 톡신이 κ°€λŠ₯함

 

β˜‘οΈ νŒŒμ΄ν”„ (pipe)

μœ λ‹‰μŠ€μ˜ ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ 단방ν–₯ 톡신 λ©”μ»€λ‹ˆμ¦˜

ps aux | more

 

톡신을 μœ„ν•œ 파일 λ²„νΌλŠ” 컀널 내에 μ‘΄μž¬ν•˜λŠ” λ²„νΌλ‘œμ„œ 보톡 4KB μ΄μƒμ˜ 크기λ₯Ό 가지고 μžˆλ‹€

νŒŒμ΄ν”„λŠ” 단방ν–₯이라 쌍방ν–₯ 톡신을 μœ„ν•΄μ„œ 2개의 νŒŒμ΄ν”„κ°€ ν•„μš”ν•˜λ‹€

 

pipe() ν•¨μˆ˜λ‘œ νŒŒμ΄ν”„λ₯Ό μƒμ‚°ν•˜λ©°, 2개의 파일 λ””μŠ€ν¬λ¦½ν„°μ— λŒ€ν•œ 배열을 인자둜 μ‚¬μš©ν•œλ‹€

νŒŒμ΄ν”„λŠ” λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ™€ μžμ‹ ν”„λ‘œμ„ΈμŠ€ μ‚¬μ΄μ˜ 톡신을 μœ„ν•΄ μ‚¬μš©λ˜λŠ”λ°, μžμ‹ ν”„λ‘œμ„ΈμŠ€μ˜ 파일 λ””μŠ€ν¬λ¦½ν„° μƒμ†μœΌλ‘œ IPC μ±„λ„μ˜ 쑰인 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€

λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ—μ„œ νŒŒμ΄ν”„λ₯Ό μƒμ„±ν•˜κ³  fork() μˆ˜ν–‰ μ‹œ 파일 λ””μŠ€ν¬λ¦½ν„° 상속 λ©”μ»€λ‹ˆμ¦˜μ— μ˜ν•΄μ„œ μžμ‹ ν”„λ‘œμ„ΈμŠ€μ—κ²Œλ„ 같은 νŒŒμ΄ν”„λ₯Ό 상속할 수 μžˆλ‹€

λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ™€ μžμ‹ ν”„λ‘œμ„ΈμŠ€μ—μ„œλŠ” νŒŒμ΄ν”„μ˜ λ°©ν–₯을 κ²°μ •ν•œ ν›„ ν•„μš” μ—†λŠ” 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό λ‹«κ³  λ‚˜λ¨Έμ§€ 파일 λ””μŠ€ν¬λ¦½ν„°λ‘œ ν†΅μ‹ ν•œλ‹€


pipe() ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ νŒŒμ΄ν”„λ₯Ό λ¨Όμ € μƒμ„±ν•œ ν›„ fork() ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ μžμ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•œλ‹€
μžμ‹ ν”„λ‘œμ„ΈμŠ€μ—μ„œ λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€λ‘œ ν˜„μž¬ μ‹œκ°„에 λŒ€ν•œ λ©”μ‹œμ§€λ₯Ό λ³΄λ‚Έλ‹€
μžμ‹ ν”„λ‘œμ„ΈμŠ€μ—μ„œλŠ” μ½κΈ°λ₯Ό μœ„ν•œ νŒŒμΌ λ””μŠ€ν¬λ¦½ν„°λ₯Ό pfd[0] λ‘œ μ„€μ •ν•œ ν›„ μ΄λ₯Ό λ‹«μ•˜κ³ ,
λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ—μ„œλŠ” μ“°κΈ°λ₯Ό μœ„ν•œ νŒŒμΌ λ””μŠ€ν¬λ¦½ν„°λ‘œ pfd[1] λ‘œ μ„€μ •ν•œ ν›„ λ‹«μ•˜λ‹€

μžμ‹ ν”„λ‘œμ„ΈμŠ€μ˜ pfd[1] μ„ ν†΅ν•΄μ„œ λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄λ©΄ λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ˜ pfd[0] μ„ ν†΅ν•΄μ„œ λ©”μ‹œμ§€λ₯Ό λ°›μ„ μˆ˜ μžˆλ‹€

ls λ‚˜ data λͺ…λ Ήμ–΄μ˜ μΆœλ ₯ κ²°κ³ΌλŠ” ν‘œμ€€ μΆœλ ₯ (stdout) ν†΅ν•΄μ„œ μΆœλ ₯λœλ‹€
ν‘œμ€€ μΆœλ ₯으둜 μΆœλ ₯λ˜λŠ” λ‚΄μš©μ„ ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ μž…λ ₯으둜 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν‘œμ€€ μΆœλ ₯을 λ‹€λ₯Έ νŒŒμΌ λ””μŠ€ν¬λ¦½ν„°λ‘œ λŒλ¦¬κ³ 
이 νŒŒμΌ λ””μŠ€ν¬λ¦½ν„°λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€ (μœ λ‹‰μŠ€μ—μ„œ dup, dup2() ν•¨μˆ˜λ₯Ό μ œκ³΅ν•¨)

date λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•˜λ©΄ ν‘œμ€€ μΆœλ ₯으둜 μΆœλ ₯λ˜λŠ” λ‚΄μš©μ΄ μžμ‹ ν”„λ‘œμ„ΈμŠ€μ˜ νŒŒμΌ λ””μŠ€ν¬λ¦½ν„° pfd[1] μœΌλ‘œ λ“€μ–΄κ°€μ„œ νŒŒμ΄ν”„λ₯Ό ν†΅ν•΄μ„œ
λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ˜ νŒŒμΌ λ””μŠ€ν¬λ¦½ν„° pfd[0] μ— μ „λ‹¬λœλ‹€
파일 λ””μŠ€ν¬λ¦½ν„° pfd[0] μ„ μ½μœΌλ©΄ μžμ‹ ν”„λ‘œμ„ΈμŠ€μ—μ„œ λ³΄λ‚Έ λ©”μ‹œμ§€λ₯Ό μ½μ„ μˆ˜ μžˆλ‹€
νŒŒμ΄ν”„μ˜ ν†΅μ‹ μ„ μœ„ν•œ μž‘업이 μ™„λ£Œλ˜λ©΄ ν•΄λ‹Ή νŒŒμΌ λ””μŠ€ν¬λ¦½ν„°λ₯Ό λ‹«μ•„μ£Όλ©΄ λœλ‹€

// νŒŒμ΄ν”„λ₯Ό μƒμ„±ν•΄μ„œ μžμ‹ ν”„λ‘œμ„ΈμŠ€μ™€ λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€ μ‚¬μ΄μ—μ„œ κ°„λ‹¨νžˆ λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨
#include <stdio.h> 		/* printf( ) ν•¨μˆ˜λ₯Ό μœ„ν•΄ μ‚¬μš© */
#include <unistd.h>
#include <sys/wait.h> 		/* waitpid() ν•¨μˆ˜λ₯Ό μœ„ν•΄ μ‚¬μš© */

int main(int argc, char **argv)
{
    pid_t pid;
    int pfd[2];
    char line[BUFSIZ]; 		/* <stdio.h> νŒŒμΌμ— μ •μ˜λœ 버퍼 크기둜 μ„€μ • */
    int status;

    if(pipe(pfd) < 0) { 	/* pipe( ) ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ νŒŒμ΄ν”„ 생성 */
        perror("pipe()");
        return -1;
    }

    if((pid = fork()) < 0) { 	/* fork( ) ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ ν”„λ‘œμ„ΈμŠ€ 생성 */
        perror("fork()");
        return -1;
    } else if(pid == 0) { 	/* μžμ‹ ν”„λ‘œμ„ΈμŠ€μΈ 경우의 처리 */
        close(pfd[0]); 		/* 읽기λ₯Ό μœ„ν•œ 파일 λ””μŠ€ν¬λ¦½ν„° λ‹«κΈ° */
        dup2(pfd[1], 1); 	/* μ“°κΈ°λ₯Ό μœ„ν•œ 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό ν‘œμ€€ 좜λ ₯(1)으둜 λ³€κ²½ */
        execl("/bin/date", "date", 0); 		/* date λͺ…λ Ήμ–΄ μˆ˜ν–‰ */
        close(pfd[1]); 		/* μ“°κΈ°λ₯Ό μœ„ν•œ 파일 λ””μŠ€ν¬λ¦½ν„° λ‹«κΈ° */
        _exit(127);
    } else { 			/* λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μΈ 경우의 처리 */
        close(pfd[1]); 		/* μ“°κΈ°λ₯Ό μœ„ν•œ 파일 λ””μŠ€ν¬λ¦½ν„° λ‹«κΈ° */
        if(read(pfd[0], line, BUFSIZ) < 0) { 	/* 파일 λ””μŠ€ν¬λ¦½ν„°λ‘œλΆ€ν„° 데이터 읽기 */
            perror("read()");
            return -1;
        }
        printf("%s", line); 	/* 파일 λ””μŠ€ν¬λ¦½ν„°λ‘œλΆ€ν„° 읽은 λ‚΄μš©μ„ 화면에 ν‘œμ‹œ */
        close(pfd[0]); 		/* 읽기λ₯Ό μœ„ν•œ 파일 λ””μŠ€ν¬λ¦½ν„° λ‹«κΈ° */
        waitpid(pid, &status, 0); 		/* μžμ‹ ν”„λ‘œμ„ΈμŠ€μ˜ μ’…λ£Œλ₯Ό 기닀리기 */
    }

    return 0;
}

/*
pipe() ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ νŒŒμ΄ν”„λ₯Ό λ¨Όμ € μƒμ„±ν•œ ν›„ fork() ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ μžμ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•œλ‹€
μžμ‹ ν”„λ‘œμ„ΈμŠ€μ—μ„œ λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€λ‘œ ν˜„μž¬ μ‹œκ°„μ— λŒ€ν•œ λ©”μ‹œμ§€λ₯Ό 보낸닀
μžμ‹ ν”„λ‘œμ„ΈμŠ€μ—μ„œλŠ” 읽기λ₯Ό μœ„ν•œ 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό pfd[0] 둜 μ„€μ •ν•œ ν›„ 이λ₯Ό λ‹«μ•˜κ³ ,
λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ—μ„œλŠ” μ“°κΈ°λ₯Ό μœ„ν•œ 파일 λ””μŠ€ν¬λ¦½ν„°λ‘œ pfd[1] 둜 μ„€μ •ν•œ ν›„ λ‹«μ•˜λ‹€

μžμ‹ ν”„λ‘œμ„ΈμŠ€μ˜ pfd[1] 을 ν†΅ν•΄μ„œ λ©”μ‹œμ§€λ₯Ό 보내면 λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ˜ pfd[0] 을 ν†΅ν•΄μ„œ λ©”μ‹œμ§€λ₯Ό 받을 수 μžˆλ‹€

ls λ‚˜ data λͺ…λ Ήμ–΄μ˜ 좜λ ₯ κ²°κ³ΌλŠ” ν‘œμ€€ 좜λ ₯ (stdout) ν†΅ν•΄μ„œ 좜λ ₯λœλ‹€
ν‘œμ€€ 좜λ ₯으둜 좜λ ₯λ˜λŠ” λ‚΄μš©μ„ ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ μž…λ ₯으둜 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν‘œμ€€ 좜λ ₯을 λ‹€λ₯Έ 파일 λ””μŠ€ν¬λ¦½ν„°λ‘œ 돌리고
이 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€ (μœ λ‹‰μŠ€μ—μ„œ dup, dup2() ν•¨μˆ˜λ₯Ό μ œκ³΅ν•¨)

date λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•˜λ©΄ ν‘œμ€€ 좜λ ₯으둜 좜λ ₯λ˜λŠ” λ‚΄μš©μ΄ μžμ‹ ν”„λ‘œμ„ΈμŠ€μ˜ 파일 λ””μŠ€ν¬λ¦½ν„° pfd[1] 으둜 λ“€μ–΄κ°€μ„œ νŒŒμ΄ν”„λ₯Ό ν†΅ν•΄μ„œ
λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ˜ 파일 λ””μŠ€ν¬λ¦½ν„° pfd[0] 에 μ „λ‹¬λœλ‹€
파일 λ””μŠ€ν¬λ¦½ν„° pfd[0] 을 읽으면 μžμ‹ ν”„λ‘œμ„ΈμŠ€μ—μ„œ 보낸 λ©”μ‹œμ§€λ₯Ό 읽을 수 μžˆλ‹€
νŒŒμ΄ν”„μ˜ 톡신을 μœ„ν•œ μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ ν•΄λ‹Ή 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό λ‹«μ•„μ£Όλ©΄ λœλ‹€

@gani0325 ➜ /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ gcc -o pipe pipe.c
@gani0325 ➜ /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ ./pipe
*/
gcc -o pipe pipe.c
./pipe

 

β˜‘οΈ FIFO

νŒŒμ΄ν”„μ™€ μœ μ‚¬ν•œ 단방ν–₯ 톡신

FIFO νŒŒμΌμ„ μ‚¬μš©ν•΄μ„œ IPC μ±„λ„μ˜ 쑰인 문제λ₯Ό ν•΄κ²°ν•œλ‹€ ( = λ„€μž„λ“œ νŒŒμ΄ν”„ Named Pipe )

 

FIFO μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” 채널 역할을 ν•˜λŠ” FIFO νŒŒμΌμ„ μƒμ„±ν•˜λŠ”λ°, 이 νŒŒμΌμ€ 데이터 μ „μ†‘μ—μ„œ μ‚¬μš©λ˜λŠ” 것이 μ•„λ‹ˆλΌ ν”„λ‘œμ„ΈμŠ€ κ°„ 채널을 ν™•λ¦½ν•˜κΈ° μœ„ν•΄μ„œλ§Œ μ‚¬μš©λœλ‹€

μ„œλ²„ ν”„λ‘œμ„ΈμŠ€λ‚˜ ν΄λΌμ΄μ–ΈνŠΈ ν”„λ‘œμ„ΈμŠ€λŠ” 각자 λ™μΌν•œ FIFO νŒŒμΌμ„ μ—΄κ³ , 얻은 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό μ΄μš©ν•΄μ„œ ν†΅μ‹ ν•œλ‹€

 

mkfifo() ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ FIFO νŒŒμΌμ„ μƒμ„±ν•˜κ³ , open() ν•¨μˆ˜ 호좜 ν›„ λ°˜ν™˜λ˜λŠ” 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό μ΄μš©ν•΄μ„œ read() λ‚˜ write() ν•¨μˆ˜λ‘œ 톡신을 μˆ˜ν–‰ν•˜λ©΄ λœλ‹€ 

// FIFO μ‚¬μš©ν•˜κΈ° μœ„ν•œ Server
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h> 			/* read(), close(), unlink() λ“±μ˜ μ‹œμŠ€ν…œ μ½œμ„ μœ„ν•œ 헀더 파일 */
#include <sys/stat.h>

#define FIFOFILE "fifo"

int main(int argc, char **argv)
{
    int n, fd;
    char buf[BUFSIZ];
    unlink(FIFOFILE); 			/* 기쑴의 FIFO νŒŒμΌμ„ μ‚­μ œν•œλ‹€. */

    if(mkfifo(FIFOFILE, 0666) < 0) { 	/* μƒˆλ‘œμš΄ FIFO νŒŒμΌμ„ μƒμ„±ν•œλ‹€. */
        perror("mkfifo()");
        return -1;
    }

    if((fd = open(FIFOFILE, O_RDONLY)) < 0) { 		/* FIFOλ₯Ό μ—°λ‹€. */
        perror("open()");
        return -1;
    }

    while((n = read(fd, buf, sizeof(buf))) > 0) 	/* FIFOλ‘œλΆ€ν„° 데이터λ₯Ό λ°›μ•„μ˜¨λ‹€. */
        printf("%s", buf); 		/* μ½μ–΄μ˜¨ 데이터λ₯Ό 화면에 좜λ ₯ν•œλ‹€. */

    close(fd);

    return 0;
}

/*
FIFO μ„œλ²„λŠ” FIFO 톡신을 μœ„ν•œ νŒŒμΌμ„ μƒμ„±ν•˜κ³  FIFO νŒŒμΌμ„ μ—° ν›„, ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 데이터가 였면 μ½μ–΄μ„œ 화면에 좜λ ₯ν•œλ‹€
FIFO μ„œλ²„λŠ” λ°±κ·ΈλΌμš΄λ“œ λͺ¨λ“œλ‘œ μ‹€ν–‰ν•œ ν›„ FIFO ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μ‹€ν–‰ν•œλ‹€
FIFO ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μž…λ ₯ν•΄μ„œ 보낸 λ‚΄μš©μ΄ μ„œλ²„λ₯Ό ν†΅ν•΄μ„œ 화면에 ν‘œμ‹œλœλ‹€
Ctrl+C λˆŒλŸ¬μ„œ ν΄λΌμ΄μ–ΈνŠΈ 싀행을 μ’…λ£Œν•˜λ©΄ FIFO κ°€ 깨지기 λ•Œλ¬Έμ— μ„œλ²„λ„ μ’…λ£Œλœλ‹€

@gani0325 ➜ /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ gcc -o fifo_server fifo_server.c 
@gani0325 ➜ /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ ./fifo_server &
*/
// FIFO μ‚¬μš©ν•˜κΈ° μœ„ν•œ Client
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

#define FIFOFILE "fifo"

int main(int argc, char **argv)
{
    int n, fd;
    char buf[BUFSIZ];

    if((fd = open(FIFOFILE, O_WRONLY)) < 0) { 		/* FIFOλ₯Ό μ—°λ‹€. */
        perror("open()");
        return -1;
    }

    while ((n = read(0, buf, sizeof(buf))) > 0) 	/* ν‚€λ³΄λ“œλ‘œλΆ€ν„° 데이터λ₯Ό μž…λ ₯λ°›λŠ”λ‹€ */
        write(fd, buf, n); 				/* FIFO둜 데이터λ₯Ό 보낸닀. */

    close(fd);

    return 0;
}

/*
FIFO νŒŒμΌμ„ μ—° ν›„ ν‚€λ³΄λ“œλ‘œλΆ€ν„° 데이터λ₯Ό μ½μ–΄μ„œ μ„œλ²„μ—κ²Œλ‘œ ν•΄λ‹Ή 데이터λ₯Ό 좜λ ₯ν•œλ‹€

@gani0325 ➜ /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ gcc -o fifo_client fifo_client.c 
@gani0325 ➜ /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ ./fifo_client
*/
gcc -o fifo_server fifo_server.c
./fifo_server &

gcc -o fifo_client fifo_client.c
./fifo_client
-> message enter

728x90
λ°˜μ‘ν˜•
Comments