首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

dup函数重定向时遇到有关问题

2013-03-22 
dup函数重定向时遇到问题#includestdio.h#includeunistd.h#includefcntl.hint main(){int fd2fd2

dup函数重定向时遇到问题
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
        int fd2;
        fd2 = open("lsttic.out",O_RDONLY|O_RDONLY|O_CREAT,777);
        if(dup2(fd2,1)==-1)
        {
                printf("dup error!!!");
                exit(0);
        }
        printf("hello world!!!\n");
        close(fd2);
        printf("hello world!!!\n");
        return 0;
}

为什么两个hello world 都既没有输出在终端上,也没有输出到文件里面?
[解决办法]
O_RDONLY
[解决办法]
O_RDONLY
[解决办法]
O_CREAT,

两个只读?
[解决办法]
改成读写后是可以的。不过第三个参数改成 0777 更好点。
[解决办法]
错误两点:
777对应的权限为1411,这个权限明显错误了. 应该用八进制表示0777,或者用S_IWUSR等这样的或
open时的mod错误,,你想要输出的,当然得用写的O_WRONLY或者O_RDWR...

把原来的lsttic.out删除...然后试下面的.

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include <stdlib.h>
int main()
{
        int fd2;
        fd2 = open("lsttic.out",O_WRONLY 
[解决办法]
 O_CREAT, 0777);
if(fd2 < 0) {
perror("open error");
exit(-1);
}
        if(dup2(fd2,1)==-1)
        {
                perror("dup error!!!");
                exit(0);
        }
        printf("hello world!!!\n");
        close(fd2);
        printf("hello world!!!\n");
        return 0;
}

[解决办法]
引用:
那怎样才能取消重定向呢?

给你看个例子吧,,
#include<stdio.h>
#include <string.h>
#include<unistd.h>
#include<fcntl.h>
#include <stdlib.h>
#include <string.h>


#define MSG"HAHAHA\n"
int main()
{
int fd;
printf("ttyname is:%s\n", ttyname(0));
printf("ttyname is:%s\n", ttyname(1));
if((fd = open(ttyname(0), O_WRONLY)) < 0) {
perror("open error");
return -1;
}
printf("new fd is %d\n", fd);


write(fd, MSG, strlen(MSG));
return 0;
}



你只是重定向了1,,所以可以用0来获得ttyname,,,然后open得到新的fd
再用dup2(fd,1)就行了. 1就重新恢复为终端上了.


[解决办法]
上述的ttyname依赖于0,1,2...获得的是伪终端的pathname

可以用ctermid..这个更好,只要不是守护进程,那一定能获得终端名,然后再open,dup2
CTERMID(3)                 Linux Programmer's Manual                CTERMID(3)

NAME
       ctermid - get controlling terminal name

SYNOPSIS
       #include <stdio.h>

       char *ctermid(char *s);

热点排行