【问题标题】:implementing anonymous pipe实现匿名管道
【发布时间】:2012-07-04 19:33:24
【问题描述】:

我正在尝试在不使用系统调用的情况下实现匿名管道: pipe()、fork()、mkfifo()、open()、read()、write()、close()。

基本上,我使用共享内存实现了匿名管道,其中两个文件描述符(两者都具有共享内存 ID) 一个用于阅读器,另一个用于编写器,通过两个信号量进行通信 我没有提到的唯一情况是fork。

我的问题是我应该如何实现 fork 调用,或者我应该如何 处理这种情况。

我可以使用 pthread_atfork() 和 atexit() 系统调用。

非常感谢。

附言

我为管道附加了一个常规的短代码,以便准确地强调应该如何 我的实施工作。

代码有效!!!它只是为了说明 我的功能应该如何工作。

    #include<unistd.h>
    #include <stdio.h>

    int main()
    {
      int pfd[2], rb;
      char buff[100]; 
 //I implemented this syscall by allocating shared memory
      if (pipe(pfd)<0)
      {
        return -1;
      }
    //here is my problem. I don’t know how to treat this syscall     
     if (fork())
      {

        sleep(5);
    //I implemented this syscall by two file descriptors which communicate via two 
    //semaphores
        write(pfd[1], "hello world\n", sizeof("hello world\n"));
        wait(NULL);
      }
      else
      {
    //I implemented this syscall by two file descriptors which communicate via two 
    //semaphores

        rb = read(pfd[0], buff, sizeof(buff));
        if (rb < 0)
          perror("SON: read");
        else
        {
          printf("SON: writing %d\n", rb);
          write(1, buff, rb);
        }
      }

      return 0;
    }

此致,

伊莱

【问题讨论】:

  • 谢谢,但正如我在问题中所写的那样。代码正常运行,无需更改
  • 为了使匿名管道工作,我们使用 fork。我正在尝试使用共享内存和信号量来实现管道。我的问题是我应该如何实现分叉调用,或者我应该如何处理这种情况。顺便说一句,这不是我的代码。代码取自背诵网站,因此应该可以正常工作(忽略他第一次关闭 pfd[1] 的事实)motigeva.com/os/files/pipe1.c
  • 因此您想使用其他操作系统原语/系统调用来模拟 pipe(2)。作业?
  • @wildplasser:“因为 (sizeof "string literal" == sizeof char*)" - 一个常见且可以理解的错误,但是虽然字符串文字很容易衰减为指针,但它们不是指针,并且 sizeof 可以正常工作在实际数组类型上(在 C 和 C++ FWIW 中),返回包含终止 NUL 的字节大小。保证编译时间,与strlen 不同(大约 10 年前,我向 Sun 提出了增强他们的编译器以在编译时对文字执行 strlen 的请求 - 标准不需要它,但 GNU 甚至在那时就做到了)。

标签: c unix operating-system system-calls


【解决方案1】:

fork 不是实现匿名管道所必需的,尽管可能需要对其进行测试。如果您在使用传统 Unix fork 的平台上,那么创建新进程的大多数方法将涉及 fork 系统调用。您的选择是:

  • vfork 后跟 exec,假设您可以找到您的程序并提供适当的参数;
  • 在外部调用程序的另一个副本;或
  • 线程 (pthread_create)。

【讨论】:

  • 如果我测试并创建了一个分叉。我该怎么办?
  • @EliKatzav 我不清楚你是否理解fork 的作用。它使用相同的图像和内存创建另一个进程实例,只有 pid 和来自fork 调用的返回不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多