- 标准文件描述符
Linux系统将每个对象当作文件处理。这包括输入和输出进程。Linux用文件描述符(file descriptor)来标识每个文件对象。文件描述符在形式上是一个非负整数,可以唯一标识会话中打开的文件。出于特殊目的,bash shell 保留了前三个文件描述符(0、1和2),见下表。
文件描述符 | 缩写 | 描述 |
---|---|---|
0 | STDIN | 标准输入 |
1 | STDOUT | 标准输出 |
2 | STDERR | 标准错误 |
- dup()和dup2()函数
#include<unistd.h>
int dup(int fd);
int dup2(int oldfd,int newfd);
- dup()和dup2()函数都可以用来复制一个文件描述符
- dup()函数返回的文件描述符是当前可用文件描述符中最小数值
- dup2()与dup()的区别在于可以用newfd来指定新描述符数值,若newfd指向的文件已经被打开,会先将其关闭。若newfd等于oldfd,就不关闭newfd,newfd和oldfd共同指向一份文件。
-
dup2(fd, 1)
即原本是指向标准输出文件描述结构体的1指向了fd,
原本输出到显示器终端的字符串打印到fd文件中。 -
管道代码
linux管道pipe详解
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
int pfds[2];
if ( pipe(pfds)==0 ){//创建管道成功返回0
if (fork() == 0){//fork()调用一次返回两次
//子进程fork()返回0
close(1);//关闭标准输出
dup2(pfds[1], 1);//1指向pfds[1]
close(pfds[0]);//随后关掉管道的读端
//规定数据从管道的写端流入 从读端流出
execlp( "ls", "ls", "-1", NULL );//ls -l的结果写入管道
}
else{
//父进程fork()返回子进程PID
close(0);//关闭标准输入
dup2( pfds[0], 0 );//0指向pfds[0]
close(pfds[1]);//随后关掉管道的写端
execlp( "wc", "wc", "-l", NULL );//读取管道的内容 wc -l
}
}
return 0;
}
-
exec函数族,wait()函数
在fork后的子进程中使用exec函数族,可以装入和运行其它程序(子进程替换原有进程,和父进程做不同的事)。
用户进程之fork()与exec函数族篇 -
open()函数
open函数的参数和作用
未完待续