c - `dup2` 是如何工作的?

标签 c linux operating-system dup2

我试图弄清楚 dup2 是如何工作的。我的目标只是复制标准输入并将其显示在标准输出上(像鹦鹉一样:))

我用一个文件做了一个非常基本的测试:

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

int main (void){
  FILE* fp= fopen("test.txt", "w");
  int fildes = fileno(fp);

  dup2(fildes, 1);
  printf("Test\n");

  close(fildes);
  fclose(fp);
  return EXIT_SUCCESS;
}

编辑 文本没有出现在 shell 中,但我的文件保持为空。

这是有效的,我犯了一个错误。

我实现entry duplication的思路是这样的:

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

typedef struct {
  int read;
  int write;
} pipe_t;

int main (void){
  pipe_t my_pipe;
  int pid;

  if (( pipe((int *)&my_pipe)== -1) || ( (pid = fork()) == -1))
    return 1;

  if(pid > 0){
    close(my_pipe.read);
    dup2(my_pipe.write, 0);
    int c;
    do{
      read(my_pipe.write, &c, 1);
      write(my_pipe.write, &c, 1);
      fflush(stdin);
    }while(c != '.');
    close(my_pipe.write);
  }

  else{
    close(my_pipe.write);
    dup2(my_pipe.read, 1);
    int c;
    do{
      read(my_pipe.read ,&c, 1);
      write(my_pipe.read, &c, 1);
      fflush(stdout);
    }while(c != '.');
    close(my_pipe.read);
  }
  return EXIT_SUCCESS;
}

删除 dup2 并将 read(my_pipe.write, &c, 1); 替换为 read(0, &c, 1);write(my_pipe.read, &c, 1); 通过 write(1, &c, 1); 有效。 但是这个只是接受输入而不做任何事情。

最佳答案

我注意到您正在打开文件进行读取,可能您想打开它进行写入以实际写入它。

fp = fopen("test.txt", "w")

您也不应该使用 close() 和 fclose() 来关闭文件。 fclose() 更合适。

关于c - `dup2` 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30821850/

相关文章:

linux - 使用 Windows 而不是 Linux 时 UDP 数据包丢失

Python 文件计数不匹配

c# - 在 C# 中识别操作系统详细信息

c - 指针导致C程序崩溃

在C中复制和合并两个字符串

mysql - 使用多处理在同一个 mysqldb 连接中查询, block ?

C++大内存分配

c - 零元素数组需要什么?

c - 函数的隐式声明

php - UTF-8贯穿始终