思路:子进程实现ls -l命令将结果返回给父进程,父进程再实现wc -l命令
在具体实现之前需要弄清一个dup函数:
int dup(int oldfd)
作用:文件描述符的复制,可以实现文件共享
实现:从小到大找第一个未使用的文件描述符, 让他和oldfd指向同一个文件表,操作任何一个都是访问同一个文件
返回值:调用成功返回新的文件描述符,失败返回-1
具体使用代码:
1 #include<stdio.h>
2 #include<fcntl.h>
3 #include<unistd.h>
4 int main()
5 {
6 int fd=open("abc.txt",O_WRONLY);
7 printf("fd=%d\n",fd);
8 close(1);
9 dup(fd);
10 write(1,"hehe",4);
11
12 }
这里我们用close(1)关闭了文件描述符,当调用dup时,它会找第一个未使用的文件描述符也就是我们刚关闭的标准输出,这时文件描述符fd与标准输出文件描述符指向同一个文件表,我们调用write往标准输出里写的时候,也就时写到了文件abc.txt里。为了验证,我们cat以下abc.txt。
ok,理解了这个之后我们返回看ls -l|wc -l命令的实现,我们只需要调用dup将子进程的输出与父进程的输入指向同一个文件描述符即可,这就起到了类似于管道的作用。对于命令的执行,我们需要调用execlp函数,它会从PATH环境变量所指的目录中查找符合参数“ls” 以及“wc”的文件名,找到后变执行该文件。
具体实现代码:
1 //子进程执行ls -l 父进程执行 wc- l
2 #include<stdio.h>
3 #include<stdlib.h>
4 #include<fcntl.h>
5 #include<unistd.h>
6
7 int main()
8 {
9 int fds[2];
10 pipe(fds);
11 pid_t pid=fork();
12 if(pid==0)
13 {
14 close(1);
15 dup(fds[1]);
16 close(fds[1]);
17 close(fds[0]);
18 execlp("ls","ls","-l",NULL);
19 exit(1);
20 }
21 else
22 {
23 close(0);
24 dup(fds[0]);
25 close(fds[0]);
26 close(fds[1]);
27 execlp("wc","wc","-l",NULL);
28 exit(1);
29 }
30 }
实现结果: