`
lobin
  • 浏览: 426025 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C: Linux C 编程 - 命名管道

 
阅读更多

命名管道

mkfifo

函数原型

int mkfifo(const char *pathname, mode_t mode);

 

mkfifo

Usage: mkfifo [OPTION]... NAME...

Create named pipes (FIFOs) with the given NAMEs.

 

# mkfifo tmp.txt

# file tmp.txt 

tmp.txt: fifo (named pipe)

# ll tmp.txt 

prw-r--r--. 1 root root 0 Oct  7 14:43 tmp.txt

 

# mkfifo -m ugo+rwx tmp_ugo+rwx.txt

# ll tmp_ugo+rwx.txt 

prwxrwxrwx. 1 root root 0 Oct  7 14:44 tmp_ugo+rwx.txt

 

# mkfifo -m a+rwx tmp_a+rwx.txt

# ll tmp_a+rwx.txt 

prwxrwxrwx. 1 root root 0 Oct  7 14:45 tmp_a+rwx.txt

 

# mkfifo -m 0777 tmp_0777.txt

# ll tmp_0777.txt 

prwxrwxrwx. 1 root root 0 Oct  7 14:45 tmp_0777.txt

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <unistd.h>
#include <errno.h>

#define INITIALIZED_BUFFER_SIZE 8

int main(int argc, char **argv)
{
  char *file = NULL;
  int fd;
  int daemon = 0;
  int i;
  int n = 0;
  
  for (i = 1; i < argc; i++)
  {
    if (! strcmp(argv[i], "-d"))
    {
      daemon = 1;
    }
    else if (! strncmp(argv[i], "--channel=", 10))
    {
      file = argv[i] + 10;
    }
    else if (! strncmp(argv[i], "--request-count=", 16))
    {
      char *p = argv[i] + 16;
      n = atoi(p);
    }
  }
  if (! file)
  {
    printf("no file.\n");
    return -1;
  }
  if (daemon)
  {
    printf("daemon.\n");
  }

  // if is's daemon, acts as server to reading request 
  // data from clients.
  if (daemon)
  {
    int rb_size = INITIALIZED_BUFFER_SIZE;
    char *rb = (char *) malloc(rb_size);
    int r_offs = 0;
    fd = open(file, O_RDONLY);
    if (fd == -1)
    {
      printf("file: open err.\n");
      return -1;
    }
    printf("file: %s open ok.\n", file);

    while (1)
    {
      int nbytes = read(fd, rb + r_offs, rb_size - r_offs);
      /*
      if (nbytes == 0)
      {
        continue;
      }
      */
      if (nbytes != -1)
      {
        if (nbytes == 0)
        {
          printf("read: eof.\n");
          free(rb);
          break;
        }
        printf("read: %d bytes read, read buffer=%.*s\n", nbytes, rb_size, rb);
        
        
        for (i = r_offs; i < r_offs + nbytes; i++)
        {
          // one request read
          if (rb[i] == '\n')
          {
            printf("---req---:start\n");
            printf("%.*s\n", i + 1, rb);
            printf("---req---:end\n");
            break;
          }
        }
        if (i >= r_offs + nbytes)
        {
          r_offs += nbytes;
          if (r_offs >= rb_size)
          {
            rb_size += INITIALIZED_BUFFER_SIZE;
            rb = realloc(rb, rb_size);
          }
        }
        else
        {
          int offs = i + 1;
          memmove(rb, rb + offs, rb_size - offs);
          r_offs = r_offs + nbytes - offs;
        }
      }
      else
      {
        printf("read: err.\n");
      }
    }
  }
  // else, acts as a client to writing request data to server.
  else 
  {
    char *req = "hello, c\n";
    int nbytes;
    fd = open(file, O_WRONLY);
    if (fd == -1)
    {
      printf("file: open err.\n");
      return -1;
    }
    printf("file: %s open ok.\n", file);

    for (i = 0; i < n; i++)
    {
      nbytes = write(fd, req, strlen(req));
      printf("write: %d bytes writed.\n", nbytes);
    }
  }
  close(fd);
}

 

0
0
分享到:
评论

相关推荐

    Linux实验八:LinuxC-编程-IO-重定向和管道.doc

    `demo5.c`和`demo6.c`可以用来演示如何向命名管道写入和读取数据。在`demo5.c`中,程序向`fifo`写入信息,而在`demo6.c`中,程序打开并读取`fifo`中的数据。这两个程序需要配合运行,以展示命名管道的功能。 通过...

    Linux下C语言编程--文件的操作

    管道文件通常由内核自动处理,但程序员可以使用 `mkfifo` 函数创建命名管道。 ```c int mkfifo(const char *pathname, mode_t mode); ``` 以上就是关于 Linux 下 C 语言编程中的文件操作相关知识点的详细介绍。...

    Linux进程间通信-命名管道实例.pdf

    命名管道(Named Pipe)是Linux IPC的一种方式,它提供了一种半双工的通信模式,允许一个进程将数据写入管道,而另一个进程则可以从管道中读取数据。在给定的文件“Linux进程间通信-命名管道实例.pdf”中,我们可以...

    头歌Linux系统编程之c编程入门

    7. **Linux高级进程通信**:涉及socket编程(本地通信)、命名管道、消息队列等进程间通信方式,这些都是多进程协作的重要手段。 8. **Linux线程管理**:讲解如何在Linux中创建、挂起、终止线程,以及使用互斥锁、...

    嵌入式Linux高级编程--04posix_进程间通信.ppt

    命名管道(FIFO)是管道的一种,可以在文件系统中作为一个特殊的设备文件而存在,多个进程可以通过命名管道共享数据。命名管道的特点包括可以被多个进程共享,可以在文件系统中保存以便以后使用。 共享内存是进程间...

    Linux下C语言编程教程

    - **进程间通信(IPC)**: 包括管道(pipe)、命名管道(fifo)、信号量(semaphore)、共享内存(shared memory)等机制。 #### 第三章 文件操作 - **文件打开与关闭**: 如何使用`open()`和`close()`函数来打开和关闭文件...

    Linux Programming Bible

    - 管道与命名管道的区别。 - 管道在进程间通信中的使用。 - FIFO的创建与使用。 - **第18章**:Internet套接字 - 套接字的基本概念。 - TCP/IP协议栈的运作原理。 - 客户端与服务器的编程模型。 - **第19章**...

    《LINUX与UNIX SHELL编程指南》读书笔记.pdf

    - `p`:表示命名管道。 - `s`:表示套接字。 - `-`:表示普通文件。 - 第2-10个字符:表示文件权限,分成三个三元组(triplet),分别对应文件属主、同组用户和其他用户的权限。 - 每个三元组中的三个字符分别...

    《linux操作系统下c语言编程入门》

    消息管理涉及到进程间的通信,常见的IPC机制包括管道、命名管道、信号量、共享内存等。 #### 七、线程操作 线程是进程中的执行单元,相比进程更加轻量级。在Linux下,使用线程的主要函数有: - `pthread_create()`...

    Linux-C-program.rar_Linux/Unix编程

    在"Linux下C语言编程--进程通信、消息管理.pdf"文档中,你可能会学到如何使用这些系统调用,以及如何在C代码中实现这些通信机制。文档可能涵盖了以下内容: 1. **进程创建与管理**:讲解`fork`、`exec`系列函数的...

    Linux头文件作用.pdf

    在Linux操作系统中,头文件是C编程中的关键组成部分,它们包含了函数声明、常量定义、数据结构以及各种宏,使得程序员可以使用操作系统提供的功能。这些头文件通常以`.h`为后缀,是编写高效、可靠的Linux程序不可或...

    linux网络编程-宋敬彬-part3

    第2章 Linux编程环境 14 2.1 Linux环境下的编辑器 14 2.1.1 vim使用简介 14 2.1.2 使用vim建立文件 15 2.1.3 使用vim编辑文本 16 2.1.4 vim的格式设置 18 2.1.5 vim配置文件.vimrc 19 2.1.6 使用其他...

    Beginning Linux Programming 4th Edition

    《Beginning Linux Programming 4th Edition》(中文名:Linux编程基础第四版)是一本经典的Linux编程指南书,由Neil Matthew与Richard Stones共同编著,由Wiley Publishing, Inc.出版发行。该书为读者提供了全面且...

    linux网络编程-宋敬彬-part2

    第2章 Linux编程环境 14 2.1 Linux环境下的编辑器 14 2.1.1 vim使用简介 14 2.1.2 使用vim建立文件 15 2.1.3 使用vim编辑文本 16 2.1.4 vim的格式设置 18 2.1.5 vim配置文件.vimrc 19 2.1.6 使用其他...

Global site tag (gtag.js) - Google Analytics