有人可以告诉我为什么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);
}
答案 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
。