Unix 编程环境上机二
班级: 学号: 姓名:
1. 实验目的:
联系使用系统调用函数hi线一个shell命令功能,进一步熟悉进程控制与进程通信。 2. 实验要求:
使用fork(), exec(), dup2(), pipe() ,open()系统调用完成与下列shell命令等价的功能。
grep –v usr < /etc/passwd | wc –l > result.txt
3. 实验过程:
a) 了解系统调用的使用:
实验中用到了fork(),exec(),dup2(),pipe(),open(),wait()这几个系统调用 i. fork()
实验中fork()用来产生新的进程,处理“grep”和“wc”这两个命令调用。用fork()==0来 判断这个进程是否是子进程,如果是子进程则在下面的代码中用exec来调用系统命令。 ii. exec()
实验中采用execlp()来执行“grep”和“wc”命令。在调用时,一个参数传入需要调用的命令,之后的参数传入命令的选项,最后一个参数为“NULL”标志参数的结束。 iii. dup2()
用来对文件描述符进行重定向。实验中主要是把文件的描述符或管道的输出端重定向到进程的标准输入和把进程的标准输出重定向到文件或管道的输入端。 iv. pipe()
用来建立管道,连接两个进程之间的输入和输出。 v. open()
用来打开文件,获取文件描述符。 vi. wait()
用来等待子进程结束。
b) 实验结果
i. 执行命令“grep –v usr < /etc/passwd | wc –l > result.txt”的结果
ii.
执行编译成的exp2后的结果:
4. 实验代码:
#include#include #include #include #include #include #include #include int main(){
int sv,fd[2],infile,outfile; char *file;
pipe(fd);//create pipe file = \"/etc/passwd\";
infile = open(file,O_RDONLY); file = \"result.txt\";
outfile = open(file,O_CREAT|O_WRONLY); if(fork() == 0){ dup2(infile,0);//redirect stdin to infile dup2(fd[1],1);//redirect stdoutto pipe in close(fd[1]); close(fd[0]); execlp(\"grep\ }
else if(fork() == 0){ dup2(fd[0],0);//redirect stdout to oufile dup2(outfile,1);//redirect stdout to outfile close(fd[1]); close(fd[0]); execlp(\"wc\ }
close(fd[1]); close(fd[0]); wait(&sv); wait(&sv); return 0; } 5. 问题:
开始照书上写的execlp(\"wc\调用系统命令时,产生了错误,
经过查找资料,发现需要将标志参数结束的0换成NULL,成功解决了问题。 6. 心得:
通过本次实验,我了解到文件描述符的使用,能够使用dup2系统调用将标准的输入输出流重定向到其他文件和使用exec调用程序,并传入参数。