系统调用中,如果要和系统命令进行多次交互,那么system函数和popen都不能胜任,popen是单向管道.
要么从中获取标准出,要么向其写入标准输入.所以用fork子进程和父进程利用pipe来进行双向通讯才
能解决.
以修改用户密码为例,当然直接执行echo mypwd|passwd myname --stdin是可以的,但为了说明
向被调用的子进程传递输入,我让子进程执行 passwd my name --stdin,然后从标准输入中获取密码.
父进程通过管道向其输入密码.然后等待子进程执行完成后,获取子进程的标准输出.来判断是否更新成功.
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
char passwd[] = "abcd1234\n";
main()
{
int mypipe[2];
char buf[256];
pid_t pid;
int stat_loc,i;
pipe(mypipe);
if ((pid = fork()) != 0) {
close(0);//父进程不需要使用标准输入.这里没有必要关闭,但为了说明
//因为要printf所以不能close(1);来重定向输出
write(mypipe[1],passwd,strlen(passwd));
//向管道写入密码后等待子进程的执行,如果是多次交互,应该使用
//状态标记来控制父子进程之间每一步的执行步骤.
waitpid(pid,&stat_loc,0);
//子进程执行完成后读取子进程的标准输出判断是否成功.
for(i=0;i<100;i++){
read(mypipe[0],buf,sizeof(buf));
//这里可以通过在上面重定向管道输入来从标准输入中读取
if(strstr(buf,"all authentication tokens updated successfully")){
printf("OK\n");
break;
}
}
exit(0);
}
else{
close(0);//关闭原来的标准输入
dup(mypipe[0]);//将管理输入重定向到标准输入
close(1);//关闭原来的标准输出
dup(mypipe[1]);//将管理输出重定向到标准输出
close(mypipe[0]);
close(mypipe[1]);
execlp("passwd","passwd", "axman","--stdin",0);
//以下代码不会执行,execlp将当前进程的执行码直接跳转到passwd开始处执行.但进程的所有状态不
//变,即从此处开始用passwd的执行码替换进程原来的执行码.
}
}
分享到:
相关推荐
总之,易语言调用系统自带的“运行命令”是一项基础但强大的功能,可以帮助我们轻松地与操作系统进行交互,实现各种实用的操作。通过熟练掌握这项技术,开发者可以更好地利用易语言编写出符合需求的应用程序。
在易语言中,有时我们需要调用操作系统的一些功能,例如与Windows命令行(CMD)交互,这时就需要使用到"控制台调用CMD命令"的技术。 控制台调用CMD命令主要涉及到进程管理和系统调用。在易语言中,我们可以使用内置...
根据提供的文件信息,知识点主要集中在如何使用Python编程语言来调用Abaqus这一专业有限元分析软件中的交互命令,进而实现自动化分析和模拟的过程,替代传统的图形用户界面(GUI)。由于文件中内容片段不多且存在...
在Linux操作系统中,系统调用是用户空间与内核空间交互的主要途径,它们提供了安全、高效的方法来执行底层操作,如文件I/O、进程管理、内存管理等。本主题将深入探讨如何在Linux 2.6.30版本中添加自定义的系统调用,...
总的来说,这个主题涵盖了Perl脚本如何与操作系统交互,如何执行系统命令,捕获输出,以及可能的跨语言交互。学习这些技能对于系统管理员、自动化工程师或者任何需要处理文本数据和控制系统的开发者都非常有用。
系统调用与系统函数调用是操作系统中至关重要的概念,它们是用户程序与操作系统交互的主要方式。在计算机科学中,当一个应用程序需要执行只有操作系统才能提供的服务时,比如磁盘I/O、进程管理或者网络通信,它就...
系统调用的重要性在于它们是用户程序能够直接与操作系统交互的唯一方式。 #### 数据结构和代码 系统调用的实现涉及到复杂的数据结构和代码逻辑。在Linux内核中,每一个系统调用都有一个唯一的编号,这个编号被用来...
系统调用是用户空间程序与操作系统内核进行交互的桥梁,它提供了安全、高效的服务接口。常见的系统调用如`open()`用于打开文件,`read()`用于读取文件,`write()`用于写入文件等。要添加新的系统调用,我们需要对...
在操作系统领域,系统调用是用户程序与操作系统内核交互的主要途径。系统调用提供了诸如创建文件、读写文件、管理进程等基本功能。在这个实验中,我们将关注如何新增一个系统调用,并统计`NtCreateFile`进程调用的...
总之,系统调用是操作系统提供的关键服务,它们通过API和封装例程与用户程序交互,通过系统调用处理程序和服务例程在内核中执行具体操作。了解系统调用的工作原理对于理解操作系统、编写高效的系统级程序以及调试...
在易语言中,调用系统自带的“运行命令”是一项常见的操作,这通常涉及到操作系统级别的交互,比如执行外部程序、打开文件或者目录等。在Windows系统中,这种功能通常由`ShellExecute` API函数实现,而易语言提供了...
在Linux操作系统中,系统调用和函数调用是两种不同的程序交互方式,它们各自有着独特的特性和应用场景。本文主要探讨了Linux系统调用和函数调用的区别以及它们在系统中的作用。 首先,系统调用是操作系统为应用程序...
Linux系统调用通过一系列预定义的接口与操作系统交互,以实现对硬件资源的管理和控制。用户程序不能直接执行硬件相关的操作,必须通过系统调用来请求操作系统代为执行。 在Linux系统中,系统调用是通过软件中断实现...
这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一般都通过门(gate)陷入(trap)实现。系统调用是用户程序和内核交互的接口。系统调用在Linux系统中发挥着巨大的作用.如果没有系统调用,那么应用...
通过学习这个易语言控制台调用CMD命令的源码,初学者可以深入理解易语言与系统交互的能力,同时也能掌握基础的CMD命令使用。这将有助于开发者在没有图形界面的情况下执行系统操作,或者在自动化脚本中集成CMD命令,...
本文将详细介绍 SVG 与 HTML 之间的交互,包括如何在 HTML 中单击命令按钮设定 SVG 中的矩形的填充颜色,并且调用 SVG 的 JS 函数 FunCallByHtmlJs,产生个消息框。在 SVG 中,单击矩形时,设置 HTML 中的文本内容,...
在Linux操作系统中,系统调用是用户空间程序与内核进行交互的重要机制。它们提供了标准接口,使得应用程序能够请求操作系统执行各种低级别的任务,如创建进程、读写文件、网络通信等。本视频讲解将深入剖析Linux ...
系统调用是用户程序与操作系统内核交互的唯一合法方式。当一个程序需要使用只有操作系统才能提供的服务(如创建进程、打开文件或分配内存)时,它会通过系统调用进入内核模式,执行相应的操作后再返回用户模式。在...
在C++中,可以通过V8的API直接与JavaScript代码交互,执行JS脚本,获取或设置变量值,甚至调用JS函数。 具体步骤包括: 1. 初始化V8环境:创建Isolate实例,这是V8引擎的核心,用于管理内存和执行上下文。 2. 创建...