简单的dup2功能不适用于ubuntu

时间:2014-04-23 15:34:46

标签: c unix dup2

有人可以告诉我为什么dup2的这个基本实现不起作用。 当我运行它时,输出不会被重定向,而只是打印在标准输出上。

   #include<unistd.h>
   #include<stdio.h>
   #include<sys/types.h>
   #include<fcntl.h>

   void main(int argc,char *argv[] )
   {
      int fd,nread;
      char buf[4096];
      if(fd=open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IROTH|S_IRGRP)<0)
          printf("error opening");

      printf("fd=%d",fd);
      if(dup2(fd,STDOUT_FILENO)==-1)
            printf("error in duplicating");

       while(nread=read(STDIN_FILENO,buf,4096))
           write(STDOUT_FILENO,buf,nread);

     }

2 个答案:

答案 0 :(得分:3)

if(fd=open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IROTH|S_IRGRP)<0)

请注意运营商优先级(<胜过=),请使用括号。您成功时将fd设置为0(stdin)。

write(STDOUT_FILENO,buf,nread);

此行失败,因为stdin未打开以进行写入。

答案 1 :(得分:0)

这是因为fd是在关系操作之后设置的,所以使用括号来避免它,

if((fd=open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IROTH|S_IRGRP))<0)

因为您使用这些括号首先为fd分配值然后执行比较,fd设置为0