c - 实现匿名管道

标签 c unix operating-system system-calls

我正在尝试在不使用系统调用的情况下实现匿名管道: 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 并不是实现匿名管道所必需的,尽管可能需要测试它。如果您使用的是传统 Unix fork 的平台,那么创建新进程的大多数方法都将涉及 fork 系统调用。您的替代方案是:

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

关于c - 实现匿名管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11326666/

相关文章:

c++ - 当编译器决定填充结构时

c - malloc 和 scanf

bash - 如何在 bash 脚本中包含 nohup?

c - 基本的unix服务器-客户端IPC(消息队列)问题

linux - 用于复制目录中的所有文件并附加 filenameCopy 的 Bash 脚本

android - 如何安装谷歌下载但安装失败的.apk

c - 什么会导致 C 程序崩溃操作系统

c - 访问结构和空指针

python - 对于 Linux 新用户来说,在 python 中获取登录名的简单方法是什么?

c - 传递指针: different value in stack?