1
2
3
4
|
#include <unistd.h>
int
dup(
int
oldfd);
int
dup2(
int
oldfd,
int
newfd);
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<sys/socket.h>
4 #include<string.h>
5 #include<fcntl.h>
6 #include<unistd.h>
7 #define _PATH_
"./test.log"
8
9
10
int
main()
11 {
12 umask(0);
13
int
fd=open(_PATH_,O_CREAT|O_WRONLY,0644);
//打开一个新的文件
14
if
(fd<0)
15 {
16
perror
(
"open"
);
17 }
18 close(1);
//关掉需要用dup指向的文件描述符,注意(dup会使fd指向一个未使用的最 //小的文件描述符)
19
int
new_fd=dup(fd);
//现在1号文件描述符指向刚才open的文件
20 close(fd);
//关闭之前open的文件描述符,如果不关闭,则从fd中也能网文件 //里写。
21
char
buf[1024];
22
while
(1)
23 {
24
memset
(buf,
'\0'
,
sizeof
(buf));
25 ssize_t size=read(0,buf,
sizeof
(buf)-1);
26
if
(size>0)
27 {
28 buf[size]=
'\0'
;
29 }
30
if
(
strncmp
(buf,
"quit"
,4)==0)
31 {
32
break
;
31 {
32
break
;
33 }
34
printf
(
"%s"
,buf);
//printf会输出到1号文件描述符中
35
fflush
(stdout);
36 }
37 close(1);
38
return
0;
39 }
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<sys/socket.h>
4 #include<string.h>
5 #include<fcntl.h>
6 #include<unistd.h>
7 #define _PATH_
"./test.log"
8
9
int
main()
10 {
11 umask(0);
12
int
fd =open(_PATH_,O_CREAT|O_WRONLY,0644);
13
if
(fd<0)
14 {
15
perror
(
"open"
);
16 }
17 close(1);
//使用dup2所使用的重定向到的文件描述符必须先关闭
18
int
newfd=dup2(fd,1);
19 close(fd);
//关闭fd现在只有1号文件描述符指向所open的文件
20
char
buf[1024];
21
printf
(
"%d\n"
,newfd);
22
while
(1)
23 {
24
memset
(buf,
'\0'
,
sizeof
(buf));
25
fgets
(buf,
sizeof
(buf)-1,stdin);
26
if
(
strncmp
(buf,
"quit"
,4)==0)
27 {
28
break
;
29 }
30
printf
(
"%s"
,buf);
31
fflush
(stdout);
32 }
33
return
0;
34 }
|