Professional Documents
Culture Documents
Linux开发环境及应用实验报告实验4SHELL管道与重定向
Linux开发环境及应用实验报告实验4SHELL管道与重定向
• Pipe () 函数:
o pipe()函数可用于创建一个管道,以实现进程间的通信。
o 对于这项任务,我将使用 pdf[]代表 pipe()函数创建一个管道,
pfd[0]和 pfd[1]分别为管道两端的文件描述符:
§ pfd[0]用于读
§ pfd[1]用于写
• Fork()函数
o 创建新进程普通文件:列出文件
o 目录:列出目录下所有文件
• Wait ()函数
o 等待进程的子进程终止
o 如果已经有子进程终止,则立即返回
• Exec () 系统调用
o Exec 不创建新进程,只是将当前进程重新初始化了指令段和用户数
据段,堆栈段以及 CPU 的 PC 指针
o exec 系统调用可以用 int execlp (char *file, char *arg0, char *arg1
,...,0);
• 编辑,编译 vim shell .c :
%
!" !"HIJ9KLM2NOPQ!"RM>STUEF%
//
// Created by 何威-2019290009 on 2022/5/29.
//
#include<stdio.h>
#include<unistd.h>
#include <errno.h>
#include<fcntl.h>
#include<sys/wait.h>
#include<sys/types.h>
#include <string.h>
int main()
{
int sv, pfd[2], in, out;
char *file;
pipe(pfd); //创建管道
file="/etc/passwd";
in=open (file, O_RDONLY);
file="r1.txt";
out=open(file, O_CREAT | O_WRONLY); //打开文件
if(fork() == 0) {
dup2(in, 0); //输入重定向
dup2(pfd[1], 1);
close(pfd[1]);
close(pfd[0]);
execlp("grep", "grep", "-v", "usr",NULL); //系统调用
}else if (fork() == 0) {
dup2(pfd[0], 0);
dup2(out, 1); //输出重定向
close(pfd[1]);
close(pfd[0]);
execlp("wc", "wc", "-l", NULL); //系统调用
}
close(pfd[0]); //不加则会死循环
close(pfd[1]);
wait(&sv);
wait(&sv); //不加则会导致僵尸进程
return 0;
}
%