上代码:
/* upper.c */
#include <stdio.h>
int main(void)
{
int ch;
while((ch = getchar()) != EOF) {
putchar(toupper(ch));
}
return 0;
}
终端输入:
upper的默认输出是终端,
gcc -g upper.c -o upper
./upper
便可以任意输入,以ctr c退出
文件管道输入;
touch file.txt
可以对file.txt输入任意字符串
终端输入./upper < file.txt
这是把file.txt通过管道作为输入端
STDIN_FILENO绑定:
STDIN_FILENO是一个打开文件句柄,对应的函数主要包插open/read/write/close等系统调用.
操作系统提共的API都是以文件描述符来表示文件(具体可学习ext2文件系统&&VFS),STDIN_FILENO就是标准输入设备,一般是键盘文件描述符,因为我们可以通过dup2将STDIN_FILENO绑定到新打开的文件描述符,实现自动化.
可再写一个包装器,
/*wrapper.c*/
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
int main(int argc,char* argv[])
{
int fd;
if(argc != 2)//参数是否正确
{
printf("please input the file path");
exit(1);
}
fd = open(argv[1],O_RDONLY);//以read only方式打开文件
if(fd < 0)//文件是否打开正确
{
printf("open file err");
exit(1);
}
dup2(fd,STDIN_FILENO);//dup2复制文件描述符
close(fd);//关闭fd
execl("./upper","upper",NULL);//execl执行,最后一个参数记得写NULL
perror("exec ./upper");
exit(1);//退出.
}
程序比较简单,但我们可以不断扩展,比如之前学习了fork,我们可以试想想能不能让子进程去打开并执行,
代码如下.
/*wrapper.c*/
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
int main(int argc,char* argv[])
{
int fd,pid;
if(argc != 2)
{
printf("please input the file path");
exit(1);
}
pid = fork();
if(pid < 0)
{
printf("fork failed");
}else if(pid == 0)
{
fd = open(argv[1],O_RDONLY);
if(fd < 0)
{
printf("open file err");
exit(1);
}
dup2(fd,STDIN_FILENO);
close(fd);
execl("./upper","upper",NULL);
perror("exec ./upper");
}else
{
//do nothing
}
exit(1);
}
分享到:
相关推荐
使用fork(),exec(),dup2(), pipe(),open()系统调用完成与下列shell命令等价的功能:grep -v usr | wc -l > result.txt
在Linux操作系统中,`dup`和`dup2`是两个重要的系统调用,它们与文件描述符管理和进程间通信紧密相关。本文将详细介绍这两个函数的工作原理、使用场景以及如何用C语言实现它们。 首先,我们来看`dup`系统调用。`dup...
`dup2` 函数的功能与 `dup` 类似,但它允许用户指定新文件描述符的数值。其函数原型如下: ```c #include int dup2(int oldfd, int newfd); ``` `dup2` 函数同样接受两个参数:`oldfd` 和 `newfd`。其中 `oldfd` ...
理解并熟练运用`dup()`和`dup2()`对于进行Linux系统编程至关重要,它们是多进程和多线程环境下共享资源、同步数据的关键工具。在实际开发中,根据具体需求选择合适的方法复制文件描述符,能够使程序设计更加高效和...
此测试工具用于开发网络通讯程序时,在服务器或客户端测试TCP/UDP通讯连接和测试数据的接收和发送情况。 【软件功能】 1.可收发TCP/UDP数据。 2.对于TCP,支持服务器和客户端模式。 3.支持多连接,可同时对多路网络...
UNIX 编程中的 dup 和 dup2 说明 UNIX 编程中的 dup 和 dup2 函数是两个非常有用的系统调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的 stdin、stdout 和 stderr。 dup 函数的原型为 `...
3.推荐喜欢自定义补丁颜色的朋友使用 cnhhkk 制作的 dUP2 的颜色辅助 设置工具 - dUP 2 Color Panel。 主页地址:http://cnhhkk.21windows.cn 镜像地址: http://vip.hanzify.org/tracky/dUP2ColorPanel.rar ...
经典的补丁工具,破解领域很有名的哦!!!!
`Test_dup2_x2.rar_android`这个压缩包可能包含了一组用于测试特定功能的代码,尤其是与数据库操作相关的部分,因为"Cursor Wrapper Test"通常涉及到对SQLite数据库查询结果的封装和测试。下面我们将深入探讨这些...
4. **控制执行时关闭**:由于它们不共享"close-on-exec"标志,因此`dup()`和`dup2()`创建的新描述符在exec系列函数执行时是否关闭是独立的。 在实际编程中,选择`dup()`还是`dup2()`取决于具体需求。如果只需要一个...
压缩包内的文件如dup2.exe是主程序,dup2.ini是配置文件,readme.txt包含了使用说明,plugins目录则包含可扩展插件,icons则存储了各种图标资源,这些都丰富了工具的功能并提供了便利。 在实际操作中,用户需要了解...
【DUP414中文驱动】是针对DUP-414设备的特定驱动程序,主要目的是为了让计算机能够正确识别并有效地与该设备进行通信。DUP-414可能是打印机、扫描仪或其他类型的外设,它需要这个驱动程序来确保在中文环境下正常工作...
文件补丁通常用于升级或修复软件的某些部分,它将变化的部分与原文件进行对比,生成只包含差异的补丁文件,这样用户只需下载较小的补丁而不是整个新版本。DUP 2.1 在文件补丁制作方面表现出色,能生成高效的补丁,...
7. **dup2.ini**:配置文件,存储用户的设置和自定义选项,补丁会根据这个文件中的信息来个性化用户的游戏体验。 8. **diablo2oo2's.wildcard.rules.ini**:可能是一份规则文件,用于定义游戏中的某些自定义规则...
大牛路过别叨叨!专业破解。功能强大。灵活的利用dup/dup2可以给你带来很多强大的功能,花了一些时间总结出上面那么多,不知道自己理解的是否透彻,只能在以后的实践中慢慢探索了。
dup函数在系统编写程序的用法 及源代码
5. `dup2.exe`:主执行文件,即dUP应用程序本身。 6. `diablo2oo2's.wildcard.rules.ini`:一个配置文件,可能包含dUP的规则或过滤条件,以适应特定的更新场景。 7. `readme.txt`:标准的文本文件,通常包含关于软件...
"dup2.19.beta"可能是指一个实验性的或者测试版本的库或者工具,其中包含了对dup2函数的改进或特定实现。在这个版本中,可能是针对dup2的某些功能进行了优化,或者修复了已知的bug。 dup2函数的主要作用是将一个已...
from command line, you input ./direction inputfile outputfile, to practice how to use dup() or dup2()
在这个过程中,dup2可能被用来管理文件句柄,确保游戏能正确地读取配置文件、日志输出或者与外部服务通信。 标签"visualc++"表明这个压缩包中的内容可能与使用Microsoft Visual C++编译器和相关工具链有关。Visual ...