Linux操作之输入输出重定向和管道

水漾月微醺 分享 2022-05-06 下载文档

Linux 操作之输入输出重定向和管道
Unix 下使用标准输入 stdin 和标准输出 stdout,来表示每个命令的输入和输出,还使 用一个标准错误输出 stderr 用于输出错误信息。这三个标准输入输出系统缺省与控制终 端设备相联系在一起的。因此,在标准情况下,每个命令通常从它的控制终端中获取输 入,将输出打印到控制终端的屏幕上。
但是也可以重新定义程序的输入 stdin 和输出 stdout,将它们重新定向。最基本的用 法是将她们重新定义到一个文件上去,从一个文件获取输入,输出到另外的文件中等。
$ ls > ls.out
$ cat < ls.out 这种输入输出重定向带来了极大的灵活性,可以将输出结果记录下来,也可以将程 序所需要的输入使用文件提前准备就绪,这样一来多次执行就不需要重新输入。
$ echo “ today is “ > out
$ date >> out 使用 >>标记表示输出结果采用添加的方式,将结果附加在文件 out 后面,而不是简 单的将原有文件重新覆盖的方式。
更为灵活的方式是将输入输出和一个执行命令联系起来,而不是一个固定的文件。
$ ls -l | grep mbox 上面的命令,将 ls -l 的输入作为 grep 的输入,这种方式称为管道。Unix 提供了很 多功能强大的小命令,但使用管道将这些命令组合起来,就形成了非常强大的工具组合, 能完成非常复杂的工作。
Unix 系统提供了一些特殊的设备文件,用在一些特殊情况下。例如一个特殊设备文 件为/dev/null,永远无法写满,写入的内容被系统立即丢弃。如果不想看到程序的输出, 可以使用它作输出。
$ make world > /dev/null 去除了屏幕输出,使整个程序执行过程非常平静。
管道文件 (转载 LINUX 下 C 入门) LINUX 还提供了< >; | <<等等重定向操作符.在这些过滤和重 定向程序当中,都用到了管 Linux 操作系统 C 语言编程入门 [24 of 104] 道这种特殊的文件.系统调用 pipe 可以创建一个管道. #include; int pipe(int fildes[2]); pipe 调用可以创建一个管道(通信缓冲区).当调用成功时,我们可以访问文件描述符 fild es[0],fildes[1].其中 fildes[0]是用来读的文件描述符,而 fildes[1]是用来写的文件描 述符. 在实际使用中我们是通过创建一个子进程,然后一个进程写,一个进程读来使用的 程序已修改调过,正确: #include #include #include #include #include #include #include #define BUFFER 255 int main(int argc,char **argv) { char buffer[BUFFER+1]; int fd[2]; if(argc!=2) { fprintf(stderr,"Usage:%s string\n\a",argv[0]); exit(1); } if(pipe(fd)!=0) { fprintf(stderr,"Pipe Error:%s\n\a",strerror(errno)); exit(1); }
if(fork()==0) { close(fd[0]); printf("Child[%d] Write to pipe\n\a",getpid()); snprintf(buff

er,BUFFER,"%s",argv[1]); write(fd[1],buffer,strlen(buffer)); printf("Child[%d] Quit\n\a",getpid()); exit(0); } else { close(fd[1]); printf("Parent[%d] Read from pipe\n\a",getpid()); memset(buffer,'\0',BUFFER+1); read(fd[0],buffer,BUFFER); printf("Parent[%d] Read:%s\n",getpid(),buffer); exit(1); }
Linux 上实现双向进程间通信管道
级别: 初级 文 吴咏炜 (adah@8ea5ff4de518964bcf847c4d), 开发者 2004 年 9 月 01 日 本文阐述了一个使用 socketpair 系统调用在 Linux 上实现双向进程通讯管道的方法,并提供了一个实 现。 问题和常见方法 Linux 提供了 popen 和 pclose 函数 (1),用于创建和关闭管道与另外一个进程进行通信。其接口如下: FILE *popen(const char *command, const char *mode); int pclose(FILE *stream); 遗憾的是, popen 创建的管道只能是单向的 -- mode 只能是 "r" 或 "w" 而不能是某种组合--用户只能选 择要么往里写,要么从中读,而不能同时在一个管道中进行读写。实际应用中,经常会有同时进行读写 的要求,比如,我们可能希望把文本数据送往 sort 工具排序后再取回结果。此时 popen 就无法用上了。 我们需要寻找其它的解决方案。 有一种解决方案是使用 pipe 函数 (2)创建两个单向管道。没有错误检测的代码示意如下: int pipe_in[2], pipe_out[2]; pid_t pid; pipe(&pipe_in); // 创建父进程中用于读取数据的管道 pipe(&pipe_out); // 创建父进程中用于写入数据的管道 if ( (pid = fork()) == 0) { // 子进程 close(pipe_in[0]); // 关闭父进程的读管道的子进程读端
close(pipe_out[1]); // 关闭父进程的写管道的子进程写端 dup2(pipe_in[1], STDOUT_FILENO); // 复制父进程的读管道到子进程的标准输出 dup2(pipe_out[0], STDIN_FILENO); // 复制父进程的写管道到子进程的标准输入 close(pipe_in[1]); // 关闭已复制的读管道 close(pipe_out[0]); // 关闭已复制的写管道 /* 使用 exec 执行命令 */ } else { // 父进程 close(pipe_in[1]); // 关闭读管道的写端 close(pipe_out[0]); // 关闭写管道的读端 /* 现在可向 pipe_out[1]中写数据,并从 pipe_in[0]中读结果 */ close(pipe_out[1]); // 关闭写管道 /* 读取 pipe_in[0]中的剩余数据 */ close(pipe_in[0]); // 关闭读管道 /* 使用 wait 系列函数等待子进程退出并取得退出代码 */ }
当然,这样的代码的可读性(特别是加上错误处理代码之后)比较差,也不容易封装成类似于 popen/pclose 的 使用。究其原因,是 pipe 函数返回的一对文件描述符只能从第一个中读、第二个中写(至少对于 Linux 是如此 就只能采取这么累赘的两个 pipe 调用、两个文件描述符的形式了。
一个更好的方案 使用 pipe 就只能如此了。不过,Linux 实现了一个源自 BSD 的 socketpair 调用 (3),可以实现上述在同一个文 的功能(该调用目前也是 POSIX 规范的一部分 (4))。


Linux操作之输入输出重定向和管道.doc 将本文的Word文档下载到电脑

下一篇:一种新型海洋来源的蒽环类化合物D19抗肿瘤活性及机制研究

相关推荐
相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xxxxxx QQ:xxxxxx