系统调用中,如果要和系统命令进行多次交互,那么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的执行码替换进程原来的执行码.
}
}
分享到:
相关推荐
使用Python调用Abaqus交互命令,替代图形交互界面,ABAQUS官方帮助文档,侵删。
这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一般都通过门(gate)陷入(trap)实现。系统调用是用户程序和内核交互的接口。系统调用在Linux系统中发挥着巨大的作用.如果没有系统调用,那么应用...
libc 提供的 API 可能直接提供一些用户态的服务,并不需要通过系统调用与内核打交道,比如一些数学函数等,但涉及与内核空间进行交互的 API 内部会封装系统调用。一个 API 可能只对应一个系统调用,也可能内部由多个...
1.QT通过QWebEngineView模块加载百度地图,通过QWebChannel 调用JS函数实现与地图数据交互。 2.点击pushButton按钮QT会调用JS函数在地图页做标注,通过上面两个输入框输入经纬度(c++调用JS)。 3.鼠标点击地图页后...
此demo主要完成的是webview中H5调用android中的方法,以及android调用H5方法,也就是Java与js的交互,简单好用。
JAVA的JNA方式与C交互调用例子工程 常用于物联网
哈工大实验源代码,自定义一个简单的系统调用WHO实现与内核交互的功能
android集成cordova 并调用h5页面 有两个H5页面
【方法】html调用本地python程序进行交互 前后端交互
SVG与html的交互(svg的js与html的js互调用)
android中Webvie和js互相调用的过程
TIA博途中已经被调用的变量,为什么交叉引用时却没有显示调用信息?
NULL 博文链接:https://fruitking.iteye.com/blog/799757
Demo中描述了如何让 WPF 窗体中的 WebBrowser 打开指定页面,并且页面中通过脚本调用托管的代码,也就是调用C#的方法。
这里是 VC与JavaScript交互(三) ———— JS调用C++,下载的时候需要看清楚
一个Android原生activity与phonegap交互的例子, java调用js,js调用java 工程中是一个嵌套了phonegap的activity ,外层是android的activity,内层framelayout中是phonegap,完成了交互的简单例子
调用 cmd(Command Prompt)是一种常见的操作系统间的交互方式。在 C# 中调用 cmd 可以实现一些系统级的操作,比如执行命令行工具,管理系统资源等。它有以下优势: (1)强大的系统级操作:通过调用 cmd,可以执行...
调用WebService与后台数据库交互示例.文档写得很详细,包括截图和全部源代码,都在里面。好好看看吧
做过 Android 混合开发的,应该都知道 Android 中 Java 代码和 Javascript 代码之间的交互怎么做。 首先回顾一下 Java 和 Javascript 之间的交互。 JavaScript 调用 Java Android 中 WebView 添加供 Html 页面调用的...
Rust与Java进行交互实例代码,使用JNI技术,实现Rust与JAVA的相互调用,从而提高执行效率,本资源是文章《【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互》的配套案例代码,供读者进行学习,查看,以...