GVKun编程网logo

os.execute是否阻塞lua中的线程?

5

关于os.execute是否阻塞lua中的线程?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ASP中Server.Execute和Execute实现动态包含(include)脚本的区别

关于os.execute是否阻塞lua中的线程?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ASP中Server.Execute和Execute实现动态包含(include)脚本的区别、execute executeQuery executeUpdate 三种的分别封装使用、ExecuteNonQuery(),ExecuteScalar(),ExecuteReader的用法、ExecuteNonQuery,ExecuteScalar,ExecuteReader的比较等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

os.execute是否阻塞lua中的线程?

os.execute是否阻塞lua中的线程?

在我的Nginx + lua应用程序操作系统执行命令行类似os.execute("ls 2>&1 | tee a.txt")我想知道它是否阻止主应用程序? 我想使用命令“执行和忘记”的情况。 如果它阻止如何修复它,并在后台线程中执行一个简单的线?

GSL-Shell:我可以添加用于扩展Lua的预编译库吗?

如何在同一个linux系统上有不同的lua版本

如何find一个包含在lua应用程序中的库

configurationNginx使用key从redis获取url,并将proxy的url到其他服务器

为什么主机系统上的lua比在linux vm中慢?

os.execute()会阻塞执行你正在运行的命令的时间,并且由于你产生了一些输出,使用io.popen不会帮助你,因为你需要从管道读取(否则过程将会仍然阻止在某一点)。

更好的方法可能是在后台运行进程 : os.execute("ls >a.txt 2>&1 &") 。 重定向>和2>顺序重要,最后在后台运行命令,解除os.execute 。

os.execute()相当于C中的system() ,因此它阻塞了线程。

如果您不想阻止,请改用io.popen 。

ASP中Server.Execute和Execute实现动态包含(include)脚本的区别

ASP中Server.Execute和Execute实现动态包含(include)脚本的区别

最近打算尝试一下在ASP中实现MVC架构,肯定有人问我:ASP都淘汰了,为什么还研究?这点我也知道,自从微软放弃ASP 3.0转向ASP.NET后,ASP已经远远落后于和它几乎同时开始的PHP和JSP,开源比闭源的好处就像PHP和ASP一样,ASP说淘汰就淘汰,谁也救不了,但是值得注意的是ASP在中国市场还是蛮广泛的,尤其是一些中小企业的一些应用,简单的CMS不在话下,而且部署简单,在一些老旧的Windows系统上,不需要安装.NET Framework基本上就可以直接运行了,所以准备一个框架,还是有必要的,不过我这个是实验性框架,只是验证ASP究竟能不能实现类似PHP的MVC架构。
好了,说了这么多,下面直接转入正题吧。这个问题的缘由是因为我需要动态包含ASP文件,大家知道在ASP中只有一种include方法,那就是SSI(Server Side Include),基本上分为以下两种:
复制代码 代码如下:

<!-- #include file="sample.asp" -->
<!-- #include virtual="sample.asp" -->

这两种基本上大家第一种用得多一些,#include virtual包含的是虚拟路径,一般虚拟目录会用得到。但是这两种都属于静态的,如果我们希望是动态包含,但不可以写成:
复制代码 代码如下:

<!-- #include file="<%=MyVar%>" -->
<!-- #include virtual="<%=MyVar%>" -->

上面的写法是错误的,可以理解为,#include指令是在ASP启动脚本引擎执行ASP<% %>标记之间脚本之前执行的,也就是说#include不是ASP的工作,而是服务端程序,如IIS的翻译工作,所以就不会理会你的ASP代码了。
如何实现类似于PHP的include、include_once、require、require_once动态包含脚本方法呢?下面再来看ASP Server对象的一个方法:Server.Execute ,搜索所有的ASP特性,可以发现这个功能最类似于动态include,我们可以做个实验:
Sample.inc.asp
复制代码 代码如下:

<%
Response.Write "Hello World!"
%>

test.asp
复制代码 代码如下:

<%
Server.Execute "Sample.inc.asp"
Response.Write "I am test.asp!"
%>

实际输出应该是“Hello World!I am test.asp!”,说明Server.Execute在动态包含方面可以工作得很好,但是如果我想包含类或者函数呢?接下来做下面这个实验:
Sample.class.asp
复制代码 代码如下:

<%
Class Sample
End Class
%>

test.asp
复制代码 代码如下:

<%
Server.Execute "Sample.class.asp"
Response.Write TypeName(Eval("New Sample"))
%>

直接运行,出现错误“Microsoft VBScript 运行时错误 错误 ''800a01fa'' 类没有被定义: ''Sample''”,结果很令人失望,为什么会出现这种情况呢?查阅了MSDN,找到这段描述:“If a file is included in the calling page by using #include, the executed .asp will not use it. For example, you may have a subroutine in a file that is included in your calling page, but the executed .asp will not recognize the subroutine name. ” 貌似和我遇到的问题有些不一样,难道Server.Execute是代码隔离的?再进行下面这个实验:
Sample.inc.asp
复制代码 代码如下:

<%
Dim MyVar
MyVar = "I am Sample!"
%>

test.asp
复制代码 代码如下:

<%
Dim MyVar
MyVar = "I am test!"
Server.Execute "Sample.inc.asp"
Response.Write MyVar
%>

结果输出的是“I am test!”,很是失望!看来Server.Execute是变量、函数、类这类代码隔离的,也就是说调用端和被调用端在代码级别上互不干扰,看来Server.Execute只能用于包含.asp模板了。
下面隆重出场的是VBScript的脚本特性Execute,传给Execute的必须是有效的VBScript脚本代码,而且Execute是上下文相关的,这点看来很接近于我们需要的动态include。
test.asp
复制代码 代码如下:

<%
Execute "Class Sample : End Class"
Response.Write TypeName(Eval("New Sample"))
%>

上面的代码成功输出我们所需要的类型名称Sample。证明Execute确实可以做到上下文相关,但是问题是利用Execute包含asp文件没有Server.Execute方便,Execute是VBScript脚本自带的,首先只能用来执行代码文本,所以需要读取一次文件内容,其次不能用来识别ASP的一些标签,比如<% %>还有一种类似于<%=MyVar %>的调用方法,所以要过滤掉<% %>,然后要转换<%=MyVar %>为Response.Write MyVar。由于我需要的是包含类文件,不会出现<%=MyVar %>,只要简单的Replace掉<% %>就可以了。关于读取文件内容和简单排除<% %>可以参考下面这个函数:
复制代码 代码如下:

Function file_get_contents(filename)
Dim fso, f
Set fso = Server.CreateObject("Scripting.FilesystemObject")
Set f = fso.OpenTextFile(Server.MapPath(filename), 1)
file_get_contents = f.ReadAll
f.Close
Set f = Nothing
Set fso = Nothing
End Function
Function class_get_contents(filename)
Dim contents
contents = file_get_contents(filename)
contents = Replace(contents, "<" & "%", "")
contents = Replace(contents, "%" & ">", "")
class_get_contents = contents
End Function

有了上面的函数我们可以直接测试下面的代码:
Sample.class.asp
复制代码 代码如下:

<%
Class Sample
End Class
%>

test.asp
复制代码 代码如下:

<%
Execute class_get_contents("Sample.class.asp")
Response.Write TypeName(Eval("New Sample"))
%>

结果输出我们所期望的Sample类型名称,看来Execute还是很强大的,确实很强大,因为经常有不怀好意者用来做“小马”,最简单的ASP一句话木马的写法估计是下面这句了:
复制代码 代码如下:
<%Execute Request("c")%>
比如这段脚本位于file.asp,然后传入file.asp?c=木马文本,呵呵,下面的事你也知道了吧。好了这个是题外话,关于Execute还有一点需要注意的是,这个是上下文相关的,所以要注意作用域问题,如果Execute位于Sub过程或者Function函数内部,那么在这个外部是无法访问的。
参考文档:《Server.Execute Method》 和《使用 Server.Execute 方法》 。
2011年11月23日更新
还有一种VBScript特有的写法叫做ExecuteGlobal,这个可以解决上文说的作用域问题,通过其执行的代码是全局有效的,但是要注意避免类、函数、过程或者变量的重定义覆盖问题。
您可能感兴趣的文章:
  • IIS6 中"ASP 0201 错误 无效的默认脚本语言" 的解决方法
  • 使用ASP控制指定站点解析脚本语言函数
  • 用InstallShield打包ASP程序的脚本
  • asp分页生成html的程序脚本代码
  • 隐藏修改文件时间和文件属性的ASP脚本
  • ASP.NET调用javascript脚本的常见方法小结
  • 从一个网站扒下的asp生成静态页面的代码 特供版
  • iis、apache与nginx禁止目录执行asp、php脚本的实现方法
  • ASP上传漏洞之利用CHR(0)绕过扩展名检测脚本
  • ASP.NET中后台注册js脚本使用的方法对比
  • ASP程序中常用的脚本语言

execute executeQuery executeUpdate 三种的分别封装使用

execute executeQuery executeUpdate 三种的分别封装使用

OSC 请你来轰趴啦!1028 苏州源创会,一起寻宝 AI 时代
package com.zhao.practice727_1;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
 * 测试类
 * @author  Administrator
 *
 */
public class TestDBPreStat {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new TestDBPreStat().testExecute();
	}
	
	/**
	 * 测试通过execute来查询数据
	 */
	public void testExecute(){
		DBPreparedStatement db = new DBPreparedStatement();
		String sql = "select name ,score from test2 where id = ?";
		Object[] arrays = {10};
		Object object =  db.getDataByExecute(sql, arrays);
		
		
		if(object instanceof List){
			List list = (List)object;
			
			for (Object obj : list) {
				Map map = (Map)obj;
				Iterator it = map.keySet().iterator();
				while(it.hasNext()){
					String key =  (String) it.next();
					String value = (String) map.get(key);
					System.out.println(key +"    "+value);
				}
				
			}
		}
		
		db.close();
	}
	
	
	
//	/**
//	 * 测试通过executeQuery或executeUpdate来查询数据
//	 */
//	public void method1(){
//		DBPreparedStatement db = new DBPreparedStatement();
//		String sql = "select name ,score from test2 where id = ?";
//		Object[] arrays = {10};
//		List list = db.getDataBySQL(sql, arrays);
//		
//		
//		for (Object object : list) {
//			Map map = (Map)object;
//			Iterator it = map.keySet().iterator();
//			while(it.hasNext()){
//				String key =  (String) it.next();
//				String value = (String) map.get(key);
//				System.out.println(key +"    "+value);
//			}
//			
//		}
//		db.close();
//	}
	

}

package com.zhao.practice727_1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * PreparedStatement工具类
 * @author  Administrator
 *
 */
public class DBPreparedStatement {
	/**
	 * 驱动字符串
	 */
	private static final String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; // 加载JDBC驱动
	/**
	 * 连接数据库的URL
	 */
	private static final String dbURL = "jdbc:sqlserver://localhost:1433; DatabaseName=Zhao722"; // 连接服务器和数据库Zhao722
	/**
	 * 用户名字符串
	 */
	private static final String USER= "sa";
	/**
	 * 密码字符串
	 */
	private static final String PASSWORD = "zhao";
	/**
	 * 数据库连接
	 */
	Connection conn = null;
	/**
	 * PreparedStatement
	 */
	PreparedStatement pstat = null;
	/**
	 * 结果集ResultSet
	 */
	ResultSet rs = null;
	
	static {
		try {
			Class.forName(driverName);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 获取数据库连接
	 * @return 
	 */
	private Connection getConnection(){
		try {
			
			conn = DriverManager.getConnection(dbURL, USER, PASSWORD);
//			System.out.println(conn);
			return conn;
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 获得PreparedStatement对象
	 * @param sql sql语句
	 * @return  PreparedStatement
	 */
	private PreparedStatement getPreparedStatement(String sql){
		try {
			pstat = getConnection().prepareStatement(sql);
			System.out.println(sql);
			return pstat;
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 获得结果集
	 * @param arrays 传入的参数数组
	 * @param sql sql语句
	 * @return  ResultSet
	 */
	private ResultSet getResultSet(String sql , Object[] arrays){
		pstat = getPreparedStatement(sql);
		
		try {
			//设置参数
			for (int i = 0; i < arrays.length; i++) {
				pstat.setObject(i+1, arrays[i]);
			}
			//开始查询
			rs = pstat.executeQuery();
			return rs;
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		return null;
	} 
	/**
	 * 增删改查的操作
	 * @param sql sql语句
	 * @param arrays 传入的参数数组
	 * @return  int
	 */
	private int getDataByUpdate(String sql , Object[] arrays){
		pstat = getPreparedStatement(sql);
		
		try {
			//设置参数
			for (int i = 0; i < arrays.length; i++) {
				pstat.setObject(i+1, arrays[i]);
			}
			//开始增删改查操作
			int i = pstat.executeUpdate();
			return i;
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		return 0;
	}
	
	/**
	 * 对结果集进行处理
	 * @param sql sql语句
	 * @param arrays 传入的参数数组
	 * @return  List
	 */
	private List getDataBySQL(String sql , Object[] arrays){
		List list = new ArrayList();
		try{
			
			rs = getResultSet(sql, arrays);
			//对结果集进行处理
			while(rs.next()){
				//定义Map来保存每行对应的每列的值
				Map map = new HashMap();
				
				//结果集元数据
				ResultSetMetaData rsmd = rs.getMetaData();
				for(int i= 1;i <= rsmd.getColumnCount();i++){
					map.put(rsmd.getColumnName(i), rs.getObject(i));
				}
				//添加map到集合中
				list.add(map);
			}
			return list;
			
		}catch(SQLException e){
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 *执行execute语句 
	 */
	public Object getDataByExecute(String sql , Object[] arrays){
		int line = 0;
		boolean hasResultSet = false;
		pstat = getPreparedStatement(sql);
		try {
			//设置参数
			for (int i = 0; i < arrays.length; i++) {
				pstat.setObject(i+1, arrays[i]);
			}
			//开始查询
			hasResultSet = pstat.execute();
			
			if(hasResultSet){
				return getDataBySQL(sql, arrays);
			}else{
					line = pstat.getUpdateCount();
					return line;
			}
			
			
			
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		
		return null;
	}
	
	/**
	 * 关闭所有打开的数据库连接
	 */
	public void close(){
		try{
			if(rs != null){
				rs.close();
			}
			if(pstat != null){
				pstat.close();
			}
			if(conn != null){
				conn.close();
			}
		}catch(SQLException e){
			e.printStackTrace();
		}
	}
}

ExecuteNonQuery(),ExecuteScalar(),ExecuteReader的用法

ExecuteNonQuery(),ExecuteScalar(),ExecuteReader的用法

下面我们将详细讲解如何在page_load()中对数据库的增加、删除、修改,最后我们再来总结一下executenonquery(),executescalar(),executereader的用法 

-------------------------------------------------------------- 
1、 增加新的记录 
private void page_load(object sender, system.eventargs e) 

myconnection.open();’打开数据库 
mycommand1.commandtext = "insert into admin values(‘aaddq‘,‘as‘,‘ss‘)"; 
mycommand1.connection = myconnection; 
mycommand1.executenonquery();’由于增加了一条记录,所以返回1 
//或者mycommand1.executereader();先增加一条记录,然后返回一个system.data.oledb.oledbdatareader类型的对象,该对象为:eof 
//或者mycommand1. executescalar();先增加一条记录,返回未实列化的对象 
myconnection.close(); 



------------------------------------------------------------------- 
2、 删除现有数据 
private void page_load(object sender, system.eventargs e) 

myconnection.open();’打开数据库 
mycommand1.commandtext = "delete * from admin"; 
mycommand1.connection = myconnection; 
mycommand1.executenonquery();’由于删除了n条记录,所以返回n 
//或者mycommand1.executereader();先删除n条记录,然后返回一个system.data.oledb.oledbdatareader类型的对象,该对象为:eof 
//或者mycommand1. executescalar();先删除n条记录,返回未实列化的对象 
myconnection.close(); 



------------------------------------------------------------ 
3、 修改现有数据 
private void page_load(object sender, system.eventargs e) 

myconnection.open();’打开数据库 
mycommand1.commandtext = "update admin set admin_code=’212’,admin_pwd=’43’ where admin_code=’23’"; 
mycommand1.connection = myconnection; 
mycommand1.executenonquery();’由于修改了1条记录,所以返回n 
//或者mycommand1.executereader();先修改了1条记录,然后返回一个system.data.oledb.oledbdatareader类型的对象,该对象为:eof 
//或者mycommand1. executescalar();先修改了1条记录,返回未实列化的对象 
myconnection.close(); 



三、关于mycommand的executenonquery(),executescalar(),executereader方法的区别: 
1、executenonquery():执行sql,返回一个整型变量,如果sql是对数据库的记录进行操作,那么返回操作影响的记录条数,如 果是sql="create table lookupcodes (code_id smallint identity(1,1) primary key clustered, code_desc varchar(50) not null)"那么在表创建成功后该方法返回 -1。 
例如: 
private void page_load(object sender, system.eventargs e) 

myconnection.open();’打开数据库 
mycommand1.commandtext = "create table lookupcodes (code_id smallint identity(1,1) primary key clustered, code_desc varchar(50) not null)"; mycommand1.connection = myconnection; 
mycommand1.executenonquery();’首先建立一个lookupcodes表,然后返回-1 
//或者mycommand1.executereader();首先建立一个lookupcodes表,然后返回一个system.data.oledb.oledbdatareader类型的对象,该对象为:eof 
//或者mycommand1. executescalar();首先建立一个lookupcodes表,返回未实列化的对象 
myconnection.close(); 



2、 executescalar():执行sql,(如果sql是查询select)返回查询结果的第一行第一列,如果(如果sql不是查询select)那 么返回未实列化的对象,因为对象未实列化,所以返回结果不能tostring(),不能equals(null),也就是说返回结果没有任何作用 

3、 executereader方法执行sql,(如果sql是查询select)返回查询结果的集合,类型是 system.data.oledb.oledbdatareader,你可以通过此结果,获取查询的数据。如果(如果sql不是查询select)那么 返回一个没有任何数据的system.data.oledb.oledbdatareader类型的集合(eof) 


四、总结: 
asp.net中对于数据库的操作方法很多,要实现统一个目标不同的人可能会采取不同的方法,就好像在asp中有的人喜欢用rs.addnew, 有的人喜欢用”insert into”,主要是看个人的习惯,当然在性能上不同的方法可能会存在较大的差别,这个只能靠我们在平常的学习中一点一滴的积累经验的。另外顺便说一下 asp.net页提供类似如下方式的操作方法: 
oledbcommand2.parameters("au_id").value = textbox1.text 
oledbcommand2.parameters("au_lname").value = textbox2.text 
oledbcommand2.parameters("au_fname").value = textbox3.text 
oledbcommand2.parameters("phone").value = textbox4.text 
oledbcommand2.parameters("address").value = textbox5.text 
oledbcommand2.parameters("city").value = textbox6.text 
oledbcommand2.parameters("st").value = textbox7.text 
oledbcommand2.parameters("zip").value = textbox8.text 
oledbcommand2.parameters("contract").value = checkbox1.checked 
cmdresults = oledbcommand2.executenonquery()

ExecuteNonQuery,ExecuteScalar,ExecuteReader的比较

ExecuteNonQuery,ExecuteScalar,ExecuteReader的比较

在机房收费系统.net版本中,用到了ExecuteNonQuery(),ExecuteScalar(),ExecuteReader这三个属性,其实这三个属性都是执行在vb.net中执行sql语句,只是他们的返回值不同,下面我来总结一下这三个属性的不同。


    Private Sub Form1_Load(sender As Object,e As EventArgs) Handles MyBase.Load
        Dim Myconn As New sqlClient.sqlConnection("server=haha-pc;database=Recharge_sys;user id=sa;password=******")
        Dim Mycmm As New sqlClient.sqlCommand("delete* from user_info ")
        Myconn.@R_301_4863@
        Mycmm.ExecuteNonQuery() '如果删除记录的条数是n,那么返回值就是n
        '或者 Mycmm.ExecuteReader() 先删除记录,返回值是一个没有任何数据的集合
        '或者 Mycmm.ExecuteScalar()先删除记录,返回值是一个未实例化的对象
        Myconn.Close()
    End Sub

 Private Sub Form1_Load(sender As Object,e As EventArgs) Handles MyBase.Load
        Dim Myconn As New sqlClient.sqlConnection("server=haha-pc;database=Recharge_sys;user id=sa;password=******")
        Dim Mycmm As New sqlClient.sqlCommand("select * from user_info ")
        Myconn.@R_301_4863@
        Mycmm.ExecuteNonQuery() '如果查到的记录的条数是n,那么返回值就是n
        '或者 Mycmm.ExecuteReader() 返回值是一个查询结果的集合
        '或者 Mycmm.ExecuteScalar()返回值是查询结果的第一行第一列
        Myconn.Close()
    End Sub
总结:

1、ExecuteNonQuery():执行sql,返回一个整型变量,如果sql是对数据库的记录进行操作,那么返回操作影响的记录条数,

2、ExecuteScalar():执行sql,如果sql是查询Select,返回查询结果的第一行第一列,如果(如果sql不是查询Select)那么返回未实列化的对象,因为对象未实列化,所以返回结果不能ToString(),不能Equals(null),也就是说返回结果没有任何作用。

3、ExecuteReader():执行sql,(如果sql是查询Select)返回查询结果的集合,你可以通过此结果,获取查询的数据。如果(如果sql不是查询Select)那么返回一个没有任何数据的集合(EOF)。

关于os.execute是否阻塞lua中的线程?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ASP中Server.Execute和Execute实现动态包含(include)脚本的区别、execute executeQuery executeUpdate 三种的分别封装使用、ExecuteNonQuery(),ExecuteScalar(),ExecuteReader的用法、ExecuteNonQuery,ExecuteScalar,ExecuteReader的比较等相关知识的信息别忘了在本站进行查找喔。

本文标签: