有名パイプ(mkfifio)

11947 ワード

有名パイプ(mkfifio)
前言
我々は日常開発では,appの異なる機能の実行をトリガするためにユーザ入力を取得することが多い.ユーザーの入力を取得するには、まずscanfやfgesなどの方法が考えられるに違いないが、これらの関数にはバックグラウンドで実行できないという特徴があり、バックグラウンドに置いたらどうやって入力を取得するのだろうか.実はlinuxの有名なパイプでこの機能を実現することができます.
linuxにはIPCの方法がたくさんありますが、この機能を実現することができます.ここはレンガを投げて玉を引くだけです.
コードの例
次のコードは、バックグラウンドでこのコードを実行し、端末にecho "h" > /tmp/mkfifioを入力するとfifoと通信できる簡単な例です.
この方法には以下の利点がある(最も重要なのは便利さである)
  • はechoで入力し、client
  • を省いた.
  • 次のコードを自分のappに埋め込むだけで、通信
  • を行うことができます.
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #define FIFO_NAME "/tmp/mkfifio"
    
    void *thread_fun(void *arg)
    {
        unlink(FIFO_NAME);
        int ret = mkfifo(FIFO_NAME, 0777);
        if (ret < 0)
        {
            perror("mkfifo failed!
    "
    ); return 0; } int fd = open(FIFO_NAME, O_RDONLY); if (fd < 0) { perror("open failed"); return 0; } printf("PIPE_BUF = %d
    "
    , PIPE_BUF); while (1) { char buf[30] = {0}; memset(buf,0,sizeof(buf)); if (read(fd, buf, sizeof(buf)) < 0) perror("read failed"); printf("%s", buf); //printf("rece is %s", buf); //failed sleep //printf("%s
    ", buf); //failed
    if (buf[0] == 'h') { printf("support cmd:
    "
    ); printf("\t1: test1
    "
    ); printf("\t2: test2
    "
    ); printf("\tq: to quit
    "
    ); } if (buf[0] == '1') { printf("in test1
    "
    ); } if (buf[0] == '2') { printf("in test2
    "
    ); } if (buf[0] == 'q') break; } close(fd); unlink(FIFO_NAME); } int main() { pthread_t ntid_rece; pthread_create(&ntid_rece, NULL, thread_fun, NULL); while (1) { sleep(1); } pthread_join(ntid_rece, NULL); return 0; }