新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Linux编程中在命令行启动另一个可执行文件或调用命令用system函数最简单了,这个函数原理是在你编写的那个程序的内部启动另一个程序或命令,从而创建一个新进程,并等待这个进程执行完毕退出。如果正常执行,system函数将返回被执行程序或命令的退出码;如果无法运行这个程序或命令,将返回错误代码127;如果是其他错误,返回-1。这个函数的原型是:
公司主营业务:成都网站设计、成都网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联建站是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联建站推出鲅鱼圈免费做网站回馈大家。
#include stdlib.h
int system(const char *string);
参数string是将要执行的程序文件名或路径,如果是启动一个命令就是一个命令字符串。
还有一种执行外部程序的方法是exec系列函数,一般是在fork的子进程里面调用exec系列函数,那主进程里直接调用exec系列不行吗,为什么要fork再在子进程里调用呢?因为exec系列的函数(包括execl函数)都是将当前进程替换成新进程,也就是说新进程启动后原来的进程就不存在了,exec系列函数后面的那些代码就不会再执行了。如果你不放在fork子进程里面,那主进程在执行execl函数后就完全不存在了,所以exec系列函数的使用都是先fork然后在子进程里面调用。因为exec系列函数都要使用fork调用,所以我一般是用system函数。
Java可以通过Runtime调用Linux命令,形式如下:
Runtime.getRuntime().exec(command)
但是这样执行时没有任何输出,因为调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例(注意:Runtime.getRuntime().exec(command)返回的是一个Process类的实例)该实例可用于控制进程或取得进程的相关信息。
由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(),Process.getErrorStream()方法重定向给它的父进程了。
用户需要用这些stream来向子进程输入数据或获取子进程的输出,下面的代码可以取到linux命令的执行结果:
try{
String[]cmd=newString[]{”/bin/sh”,“-c”,”ls“};
Processps=Runtime.getRuntime().exec(cmd);
BufferedReaderbr=newBufferedReader(newInputStreamReader(ps.getInputStream()));
StringBuffersb=newStringBuffer();
Stringline;
while((line=br.readLine())!=null){
sb.append(line).append(”\n”);
}
Stringresult=sb.toString();
System.out.println(result);
}catch(Exceptione){
e.printStackTrace();
}
目的:用Python做出全自动化的pipline,用于rrbs
最近有个需求就是页面上执行shell命令,第一想到的就是os.system,
os.system('cat /proc/cpuinfo')
但是发现页面上打印的命令执行结果 0或者1,当然不满足需求了。
尝试第二种方案 os.popen()
output = os.popen('cat /proc/cpuinfo')printoutput.read()
通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出。但是无法读取程序执行的返回值)
尝试第三种方案 commands.getstatusoutput() 一个方法就可以获得到返回值和输出,非常好用。
(status, output) = commands.getstatusoutput('cat /proc/cpuinfo')printstatus, output
Python Document 中给的一个例子,
import commands commands.getstatusoutput('ls /bin/ls')
(0, '/bin/ls') commands.getstatusoutput('cat /bin/junk')
(256,'cat: /bin/junk: No such file or directory') commands.getstatusoutput('/bin/junk')
(256,'sh: /bin/junk: not found') commands.getoutput('ls /bin/ls')'/bin/ls' commands.getstatus('/bin/ls')'-rwxr-xr-x 1 root 13352 Oct 14 1994 /bin/ls'
最后页面上还可以根据返回值来显示命令执行结果。
首先,命令应该是好和其他两个区分开来的了,因为命令都是可以直接敲在shell上面回车执行的,而系统调用和库函数都不行;
其次,百Linux系统调用和C库函数都是函数的形式,即都是“func(args)”的形式,但系统调用是
由系统内核对外提供的服务接口;C库函数和你自己写的普通的函数没有本质的区别,只是在度C标准库中而已,Linux上面glibc就是C函数库。从表专面上看两者不太好区分,不过,你可以从它们需要包含的头文件来区分,C库函数像printf在stdio.h中,std就是标准(standard)的缩写形式,因此在stdxxx.h中的函数,基本都是C库函数;像
ssize_t
read(int
fd,
void
*buf,
size_t
count);这样很多的系统调用是包含在unistd.h中的,unistd意思是UNIX
Standard,从这个意义就可以区分了。
希望对你有所帮助,如还有问题,可随属时联系我:-)