- 每一个 Linux 进程,启动时会新建三个文件描述符 0,1,2.我们称呼它们为 标准输入,标准输出,标准错误。
文件描述符是用来操作文件的一个标识,是一个数字。
ps -ef 可见所有进程,选择一个进程的 PID,如 22575
查看该进程所有的文件描述符:lsof -p 进程号
[root@localhost asm-generic]# lsof -p 22575
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 22575 root txt REG 253,0 964608 50339657 /usr/bin/bash
...
...
bash 22575 root 0u CHR 136,1 0t0 4 /dev/pts/1
bash 22575 root 1u CHR 136,1 0t0 4 /dev/pts/1
bash 22575 root 2u CHR 136,1 0t0 4 /dev/pts/1
bash 22575 root 255u CHR 136,1 0t0 4 /dev/pts/1
[root@localhost asm-generic]#
如上,FD 对应的应该就是 进程 22575 新建的文件描述符 0,1,2,255,等等文件描述符
可见,这三个文件描述符都指向了一个文件 /dev/pts/1 ,也就是我当前的 终端屏幕。
再找一个进程举例:
pickup 25512 postfix 0u CHR 1,3 0t0 1028 /dev/null
pickup 25512 postfix 1u CHR 1,3 0t0 1028 /dev/null
pickup 25512 postfix 2u CHR 1,3 0t0 1028 /dev/null
在这个进程,它们指向 /dev/null 。
- 操作这三个文件描述符。
将 “123”写入到普通文件
int fd = open ( "fd.txt",O_CREAT|O_RDWR );
write ( fd, "123", sizeof("123" ) );
将 “123”写入到标准错误:
write ( 2, buf, sizeof( buf ) );
执行程序可见差异。
全部代码:
[root@localhost test]# cat fds.c
include <stdio.h>
include <fcntl.h>
include <unistd.h>
include <sys/socket.h>
include <errno.h>
int main()
{
char buf[1024]="1234\n";
int fd;
if(write(2,buf,sizeof(buf))==-1)
printf("error\n");
buf[0]='a';
if(write(1,buf,sizeof(buf))==-1)
printf("error\n");
if(write(0,buf,sizeof(buf))==-1)
printf("error\n");
fd = open("ddd.txt",O_CREAT|O_RDWR);
if(write(3,buf,sizeof(buf))==-1)
printf("error\n");
return 0;
}
运行结果:
[root@localhost test]# ./a.out
1234
a234
a234
[root@localhost test]# cat ddd.txt
a234
[root@localhost test]#
如上,输入到这三个文件的内容都输出在了屏幕。而输入文件的内容没有输出到屏幕,而是输出到了文件里。
可见,没有对它们重定向的话,默认是指向 当前终端。
如果对你有所帮助,点个赞吧。如果有错误,请告知,谢谢啦。
网友评论