`
M_ittrue
  • 浏览: 76980 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

运用exec与dup2写的小测试

 
阅读更多

上代码:

 

/* 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 result.txt

    使用fork(),exec(),dup2(), pipe(),open()系统调用完成与下列shell命令等价的功能:grep -v usr | wc -l &gt; result.txt

    dup_dup2介绍

    在Linux操作系统中,`dup`和`dup2`是两个重要的系统调用,它们与文件描述符管理和进程间通信紧密相关。本文将详细介绍这两个函数的工作原理、使用场景以及如何用C语言实现它们。 首先,我们来看`dup`系统调用。`dup...

    详细介绍dup2函数用法,一看必懂.。。。

    `dup2` 函数的功能与 `dup` 类似,但它允许用户指定新文件描述符的数值。其函数原型如下: ```c #include int dup2(int oldfd, int newfd); ``` `dup2` 函数同样接受两个参数:`oldfd` 和 `newfd`。其中 `oldfd` ...

    文件描述符的复制:dup()和dup2()示例代码

    理解并熟练运用`dup()`和`dup2()`对于进行Linux系统编程至关重要,它们是多进程和多线程环境下共享资源、同步数据的关键工具。在实际开发中,根据具体需求选择合适的方法复制文件描述符,能够使程序设计更加高效和...

    TCP/DUP数据测试工具

    此测试工具用于开发网络通讯程序时,在服务器或客户端测试TCP/UDP通讯连接和测试数据的接收和发送情况。 【软件功能】 1.可收发TCP/UDP数据。 2.对于TCP,支持服务器和客户端模式。 3.支持多连接,可同时对多路网络...

    UNIX编程中的dup和dup2说明

    UNIX 编程中的 dup 和 dup2 说明 UNIX 编程中的 dup 和 dup2 函数是两个非常有用的系统调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的 stdin、stdout 和 stderr。 dup 函数的原型为 `...

    dup2 v2.18.3

    3.推荐喜欢自定义补丁颜色的朋友使用 cnhhkk 制作的 dUP2 的颜色辅助 设置工具 - dUP 2 Color Panel。 主页地址:http://cnhhkk.21windows.cn 镜像地址: http://vip.hanzify.org/tracky/dUP2ColorPanel.rar ...

    dup2 补丁工具

    经典的补丁工具,破解领域很有名的哦!!!!

    Test_dup2_x2.rar_android

    `Test_dup2_x2.rar_android`这个压缩包可能包含了一组用于测试特定功能的代码,尤其是与数据库操作相关的部分,因为"Cursor Wrapper Test"通常涉及到对SQLite数据库查询结果的封装和测试。下面我们将深入探讨这些...

    简要对比C语言中的dup()函数和dup2()函数

    4. **控制执行时关闭**:由于它们不共享"close-on-exec"标志,因此`dup()`和`dup2()`创建的新描述符在exec系列函数执行时是否关闭是独立的。 在实际编程中,选择`dup()`还是`dup2()`取决于具体需求。如果只需要一个...

    dup2.25内存补丁制作工具

    压缩包内的文件如dup2.exe是主程序,dup2.ini是配置文件,readme.txt包含了使用说明,plugins目录则包含可扩展插件,icons则存储了各种图标资源,这些都丰富了工具的功能并提供了便利。 在实际操作中,用户需要了解...

    DUP414中文驱动

    【DUP414中文驱动】是针对DUP-414设备的特定驱动程序,主要目的是为了让计算机能够正确识别并有效地与该设备进行通信。DUP-414可能是打印机、扫描仪或其他类型的外设,它需要这个驱动程序来确保在中文环境下正常工作...

    DUP 2.1 补丁编写工具

    文件补丁通常用于升级或修复软件的某些部分,它将变化的部分与原文件进行对比,生成只包含差异的补丁文件,这样用户只需下载较小的补丁而不是整个新版本。DUP 2.1 在文件补丁制作方面表现出色,能生成高效的补丁,...

    dup 补丁 2.2汉化版

    7. **dup2.ini**:配置文件,存储用户的设置和自定义选项,补丁会根据这个文件中的信息来个性化用户的游戏体验。 8. **diablo2oo2's.wildcard.rules.ini**:可能是一份规则文件,用于定义游戏中的某些自定义规则...

    Dup2_v2.26_汉化版 专注于破解

    大牛路过别叨叨!专业破解。功能强大。灵活的利用dup/dup2可以给你带来很多强大的功能,花了一些时间总结出上面那么多,不知道自己理解的是否透彻,只能在以后的实践中慢慢探索了。

    dup源代码dup

    dup函数在系统编写程序的用法 及源代码

    dUP v2.17 Beta 23

    5. `dup2.exe`:主执行文件,即dUP应用程序本身。 6. `diablo2oo2's.wildcard.rules.ini`:一个配置文件,可能包含dUP的规则或过滤条件,以适应特定的更新场景。 7. `readme.txt`:标准的文本文件,通常包含关于软件...

    dup2.19.beta

    "dup2.19.beta"可能是指一个实验性的或者测试版本的库或者工具,其中包含了对dup2函数的改进或特定实现。在这个版本中,可能是针对dup2的某些功能进行了优化,或者修复了已知的bug。 dup2函数的主要作用是将一个已...

    transfer file by dup2

    from command line, you input ./direction inputfile outputfile, to practice how to use dup() or dup2()

    dup2 - FilePlanet_visualc++_

    在这个过程中,dup2可能被用来管理文件句柄,确保游戏能正确地读取配置文件、日志输出或者与外部服务通信。 标签"visualc++"表明这个压缩包中的内容可能与使用Microsoft Visual C++编译器和相关工具链有关。Visual ...

Global site tag (gtag.js) - Google Analytics