我试图弄清楚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中,但我的文件保持为空。
这很有效,我犯了个错误。
我的想法是实现条目复制如下:
#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/

10-11 12:29