首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么调用Perl的exec内置会导致此函数不返回其调用者?

Perl的exec内置函数用于执行外部命令,并且在执行完毕后不会返回到调用者。这是因为exec函数会将当前进程替换为要执行的外部命令,而不是创建一个新的子进程来执行命令。

当调用exec函数时,它会首先关闭当前进程的所有文件描述符,然后加载并执行指定的外部命令。因此,一旦exec函数执行成功,原始的Perl进程就会被替换为外部命令的进程,而不会再返回到调用者。

这种行为在某些情况下是有用的,特别是当我们希望在执行外部命令后不再继续执行原始的Perl脚本时。例如,当我们需要在Perl脚本中调用其他编程语言的可执行文件或系统命令时,可以使用exec函数来实现。

然而,如果我们希望在执行外部命令后继续执行原始的Perl脚本,我们可以使用Perl的system函数。与exec函数不同,system函数会创建一个新的子进程来执行指定的外部命令,并在命令执行完毕后返回到调用者。

总结起来,调用Perl的exec内置函数会导致此函数不返回其调用者,是因为exec函数会替换当前进程为要执行的外部命令进程,而不是创建一个新的子进程。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

翻译:Perl代码审计:Perl脚本中存在问题与存在安全风险

如果未经验证就使用,对此类应用程序不当输入就可能导致许多问题。在没有正确验证情况下,使用用户提供参数执行其他程序,使最常见错误。...system() 和exec()函数 Perl语言以其“粘贴语言”而出名,它可以出色地调用其他程序来帮协助完成它工作。...当Perl遇到exec()语句时,它会查看调用exec()时使用参数,然后启动一个执行指定命令新进程。Perl从不将控制权返回调用exec()原始进程。...一个常见问题是,某些版本Unix“mail”实用程序,在看到~!上下文中转义序列。因此,用户输入包含!rm -”在某些情况下可能导致问题。...就安全性而言,上面提到 system()函数同样适用于exec() open()函数 Perlopen()函数用于打开文件。

2.7K51

Perl语言入门》——读书笔记

调用子程序 使用&符号来调用:&func_name 当调用者在被调用之后,可以直接使用函数名,可不使用&符号来调用: sub func_name { return 0; } func_name...使用子程序调用语法格式来调用,可不适用&符号来调用:func_name( @args ) 注意:建议只有在调用内置时候省略&符号,其余都加上&符号来区分调用内置还是自定义子程序。...\n"; 无法得知 注意:重新打开STDIN,STDOUT,STDERR时,Perl恢复默认文件句柄。...其他综述 命令选项多余一两个:参阅“Getopt::Long”和"Getopt::Std" 除非会改变表达式意义,否则Perl括号可以省略 加入print调用看起来像函数调用,它就是一个函数调用...,而不是用智能匹配符去测试$_ 在when中调用子程序/内置函数 否定表达式,包括否定正则表达式 第十六章 进程管理 建议:在此不做详细解读,请阅读《UNIX高级环境编程》 system system

2.5K20
  • QThread类

    返回新创建QThread实例。 注意:调用者获得返回QThread实例所有权。   注意:函数仅在使用c++ 17时可用。    ...返回新创建QThread实例。 注意:调用者获得返回QThread实例所有权。   注意:函数仅在使用c++ 17时可用。    ...调用函数后,线程离开事件循环,并从对QEventLoop::exec()调用返回。QEventLoop::exec()函数返回退出代码。     ...请注意,与同名C库函数不同,函数返回调用者和停止事件处理。     调用exit函数后在此线程中不再启动QEventLoop,直到再次调用QThread::exec()。...警告:功能很危险,鼓励使用。线程可以在其代码路径中任何位置终止。修改数据时可以终止线程。导致线程无法自行清理,解锁任何保持互斥锁等。简而言之,只有在绝对必要情况下才使用功能。

    2.6K20

    QThread类

    注意:调用者获得返回QThread实例所有权。 注意:函数仅在使用c++ 17时可用。 警告:不要多次调用返回QThread实例上start(),这样做导致未定义行为。   ...注意:调用者获得返回QThread实例所有权。 注意:函数仅在使用c++ 17时可用。 警告:不要多次调用返回QThread实例上start(),这样做导致未定义行为。   ...调用函数后,线程离开事件循环,并从对QEventLoop::exec()调用返回。QEventLoop::exec()函数返回退出代码。   ...请注意,与同名C库函数不同,函数返回调用者和停止事件处理。   调用exit函数后在此线程中不再启动QEventLoop,直到再次调用QThread::exec()。...警告:功能很危险,鼓励使用。线程可以在其代码路径中任何位置终止。修改数据时可以终止线程。导致线程无法自行清理,解锁任何保持互斥锁等。简而言之,只有在绝对必要情况下才使用功能。

    1.3K20

    JavaScript调用提速40%实践

    最终,执行会尾调用内置 Call。它会在那里检查目标是否是适当函数、构造器或任何可调用对象。它还会读取共享 shared function info 结构以获得形式参数计数。...参数适配器框架 现在,我们使用更少或更多实参来调用 add42: add42(); add42(1, 2, 3); JS 开发人员知道,在第一种情况下,x 将被分配 undefined,并且该函数返回...它创建了一个被调用者函数接口,因此后者无需知道参数数量。被调用者将始终能够使用与以前相同计算结果来访问参数,即 [ai] = 2 + parameter_count - i - 1。...因此,在调用 add42(1,2,3) 情况下,参数适配器框架中插槽将被修改,但调用者框架仍将包含数字 1。我们需要注意,参数对象正在访问修改后值,而不是旧值。从函数返回很简单,只是很慢。...它应该会有更多静态信息来执行操作并发出更少计算机指令。 带参数适配器框架 TurboFan 现在,让我们来看看参数数量和参数计数匹配情况。考虑调用 add42(1, 2, 3)。

    39510

    深度辨析 Python eval() 与 exec()

    (a) >>> print(my_dict) {'name': 'Python猫', 'age': 18} eval() 函数返回值是 expression 执行结果,在某些情况下,它会是 None...>>> result = eval('[].append(2)') >>> print(result) None exec() 函数返回值只会是 None,与执行语句结果无关,所以,将 exec()...4、为什么要慎用 eval() ? 很多动态编程语言中都会有 eval() 函数,作用大同小异,但是,无一例外,人们告诉你说,避免使用它。 为什么要慎用 eval() 呢?...上例将它映射成 None,就意味着限定了 eval 可用内置命名空间为 None,从而限制了表达式调用内置模块或属性能力。 但是,这个办法还不是万无一失,因为仍有手段可以发起攻击。...5、安全替代用法 既然有种种安全隐患,为什么要创造出这两个内置方法呢?为什么要使用它们呢? 理由很简单,因为 Python 是一门灵活动态语言。

    65120

    深度辨析 Python eval() 与 exec()

    (a) >>> print(my_dict) {'name': 'Python猫', 'age': 18} 复制代码 eval() 函数返回值是 expression 执行结果,在某些情况下,它会是...>>> result = eval('[].append(2)') >>> print(result) None 复制代码 exec() 函数返回值只会是 None,与执行语句结果无关,所以,将 exec...4、为什么要慎用 eval() ? 很多动态编程语言中都会有 eval() 函数,作用大同小异,但是,无一例外,人们告诉你说,避免使用它。 为什么要慎用 eval() 呢?...上例将它映射成 None,就意味着限定了 eval 可用内置命名空间为 None,从而限制了表达式调用内置模块或属性能力。 但是,这个办法还不是万无一失,因为仍有手段可以发起攻击。...5、安全替代用法 既然有种种安全隐患,为什么要创造出这两个内置方法呢?为什么要使用它们呢? 理由很简单,因为 Python 是一门灵活动态语言。

    57150

    python基础教程:内置函数(二)

    标准名称包括: 如果存在编码错误,’strict’ 引发 ValueError 异常。 默认值 None 具有相同效果。 ‘ignore’ 忽略错误。请注意,忽略编码错误可能导致数据丢失。...如果它是 ”,则启用通用换行模式,但行结尾将返回调用者未翻译。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结尾将返回给未调用调用者。...注解 不要更改字典内容;更改不会影响解释器使用局部变量或自由变量值。 help([object]) 启动内置帮助系统(函数主要在交互式中使用)。...像所有装饰器一样,也可以像常规函数一样调用 staticmethod ,并对结果执行某些操作。比如某些情况下需要从类主体引用函数并且您希望避免自动转换为实例方法。...注意类是可调用调用返回一个新实例)。如果实例类有 call() 方法,则它是可调用。 delattr(object, name) setattr() 相关函数

    1.3K20

    深入理解Js中this

    ,而与之相对应是动态作用域dynamic scope则不同,函数作用域中遇到既不是参数也不是函数内部定义局部变量时,到函数调用上下文中去查。...所以在函数内部this为undefined 隐式绑定 对象属性引用链中只有最顶层或者说最后一层影响this,同样也是this永远指向调用者,具体点说应该是指向最近调用者,当然箭头函数除外,另外我们可能有意无意地创建间接引用地情况...如果该函数没有返回对象,则返回步骤1创建对象。 function _new(base,...args){ var obj = {}; obj....箭头函数没有单独this,在箭头函数函数体中使用this时,取得上下文context环境中this。...() => { console.log(this); } }, t5: function(){ // 测试函数调用时箭头函数this指向,指向了上一层对象调用者

    42810

    深度辨析 Python eval() 与 exec()

    (a) >>> print(my_dict) {'name': 'Python猫', 'age': 18} eval() 函数返回值是 expression 执行结果,在某些情况下,它会是 None...>>> result = eval('[].append(2)') >>> print(result) None exec() 函数返回值只会是 None,与执行语句结果无关,所以,将 exec()...4、为什么要慎用 eval() ? 很多动态编程语言中都会有 eval() 函数,作用大同小异,但是,无一例外,人们告诉你说,避免使用它。 为什么要慎用 eval() 呢?...上例将它映射成 None,就意味着限定了 eval 可用内置命名空间为 None,从而限制了表达式调用内置模块或属性能力。 但是,这个办法还不是万无一失,因为仍有手段可以发起攻击。...5、安全替代用法 既然有种种安全隐患,为什么要创造出这两个内置方法呢?为什么要使用它们呢? 理由很简单,因为 Python 是一门灵活动态语言。

    2.9K00

    正则表达式在 ES2018 中新写法

    通常一行正则表达式代码就能完成需要几十行代码才能搞定文本处理任务。 虽然大多数语言中内置函数足以对字符串进行一般搜索和替换操作,但更加复杂操作(例如验证文本输入)通常需要使用正则表达式。...如果找到匹配项, exec() 将返回一个数组,其中第一个元素是匹配字符串。 数组 index 属性保存匹配字符串索引, input 属性保存搜索执行整个字符串。...Perl支持与 JavaScript 相同语法命名组( JavaScript 已经模仿了 Perl 正则表达式语法)。 Java也使用与Perl相同语法。...被认为是一个数字,但 \d 只能匹配ASCII [0-9],因此 test() 方法返回 false。 因为改变速记字符类行为破坏现有的正则表达式模式,所以决定引入一种新类型转义序列。...github.io/proposal-regexp-unicode-property-escapes/#sec-static-semantics-unicodematchproperty-p】 请注意,使用不受支持属性导致

    96020

    go里面的异常处理

    panic 内置函数1) 假如函数F中书写了panic语句,终止其后要执行代码,在panic所在函数F内如果存在要执行defer函数列表,按照defer逆序执行2) 返回函数F调用者G,在G中...,调用函数F语句之后代码不会执行,假如函数G中存在要执行defer函数列表,按照defer逆序执行直到goroutine整个退出,并报告错误recover内置函数1) 用来控制一个goroutine...传递error注意:利用recover处理panic指令,defer 必须放在 panic 之前定义,另外 recover 只有在 defer 调用函数中才有效。...recover 处理异常后,逻辑并不会恢复到 panic 那个点去,函数跑到 defer 之后那个点。多个 defer 形成 defer 栈,后定义 defer 语句会被最先调用。...,首先是 check 关键字,可以选中一个表达式 check f(x, y, z) 或 check err,将会标识这是一个显式错误检查。

    38070

    写时复制技术详解(COW)

    核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上数据存储),他们共同获取相同指针指向相同资源,直到某个调用者试图修改资源内容时,系统才会真正复制一份专用副本(private...copy)给该调用者,而其他调用者所见到最初资源仍然保持不变。...这过程对其他调用者都是透明作法主要优点是如果调用者没有修改该资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源。...但vfork它并不将父进程地址空间完全复制到子进程中,因为子进程立即调用 exec(exit),于 是也就不会存访该地址空间。不过在子进程调用 exec或exit之前,它在父进程空间中运行。...vfork和fork之间另一个区别是:vfork保证子进程先运行,在它调用exec或exit之后父进 程才可能被调度运行。 (如果在调用这两个函数之前子进程依赖于父进程进一步动作,则会 导致死锁。

    5.1K11

    php面试题(1)

    301 (永久移动) 请求网页已永久移动到新位置。 服务器返回响应(对 GET 或 HEAD 请求响应)时,自动将请求者转到新位置。...415 (不支持媒体类型) 请求格式不受请求页面的支持。 416 (请求范围不符合要求) 如果页面无法提供请求范围,则服务器返回状态代码。...clone方法,在调用方法是对象自动调用__clone魔术方法,如果在对象复制需要执行某些初始化操作,可以在__clone方法实现。...PERL兼容正则中可能使用修正符(修正符中空格和换行被忽略,其它字符导致错误): i (PCRE_CASELESS): 匹配时忽略大小写。...shell_exec()(在功能上和 backticks 函数相同) 当 PHP 运行在 安全模式 时,不能使用函数

    3.6K20

    缓存Python函数运行结果:Memoization

    ,然后在将结果返回调用者之前更新缓存 给定足够缓存存储,这实际上保证了一个特定函数参数集函数结果只能计算一次。...,并构建一个函数作为输出。...所以,我们不是重新计算结果,而是从缓存中快速返回。 如果结果不在缓存中,我们必须更新缓存,以便将来可以节省一些时间。因此,我们首先计算缺失结果,将其存储在缓存中,然后将其返回调用者。...我们memoize装饰器不是递归地计算第35个斐波纳契数,而是简单地取出缓存结果并立即返回,而这又导致了第二次基准测试中令人难以置信加速。...我建议你在生产代码中使用这种技术—— 但这里它是一个很好调试技巧。 正如你所看到,缓存字典将memoized_fibonacci函数调用参数元组映射到函数结果(第n个斐波那契数)。

    2.1K50

    Linux 提权总结

    UID: 在高权限用户降权后,保留原本UID (展开说) 所以增加了一个s权限,该程序在实际运行时Effective UID就会变为0,即rootUID sudo 就是能把一个命令视作root来执行...perl -e 'exec "/bin/sh";' ruby ruby -e 'exec "/bin/bash"' cp bypass 直接用cp把/usr/bin里命令复制过来就行了 直接更改PATH...这个提权方法思想是,找到有suid,内部有system函数调用未指定路径命令文件。...同时用户有修改自己环境变量权限, 我们就可以通过劫持system函数调用脚本文件,使其指向我们环境变量里自行创建一个同名脚本文件,那么这个我们自行创建同名脚本文件就能以root权限运行了,如果这个脚本文件里命令是.../ps 没这条命令导致提权失败 cd /home/const27 .

    6.4K20

    Python内置函数详解【翻译自pyth

    如果源包含空字节,则函数引发SyntaxError(如果编译源无效)和ValueError 如果要将Python代码解析为AST表示形式,请参阅ast.parse()。...如果对象具有名为__dir__()方法,那么将调用方法,并且必须返回属性列表。...注 内置函数globals()和locals()分别返回当前全局和局部字典,它们可以用做传递给exec()第二和第三个参数。...默认值None具有相同效果。 'ignore'忽略错误。请注意,忽略编码错误可能导致数据丢失。 'replace'导致替换标记(例如'?')插入到存在格式错误数据位置。...如果它是'',则启用通用换行符模式,但行结尾将返回调用者而不会转换。如果它具有任何其它合法值,则输入行仅由给定字符串终止,并且行结尾被返回调用者而不会转换。

    1.5K20

    【编程基础】前置++和后置++详解

    前置++: type operator++(); 后置++: const type operator++(int ); 为了编译器区分前置和后置++,C++规定后缀形式有一个int类型参数 ,当函数调用时...,编译器传递一个0做为int参数值给该函数。...那为什么前置和后置返回参数不同呢?...那为什么返回const &呢?因为不能这么做,返回引用将无效,临时对象已经不存在了。 所以后置返回const 对象即限制对此临时对象进行误操作,并显式地告诉调用者对象仅为原对象副本。...另外还有一个原因:内置int类型并不支持 i++++ .而如果后置++返回一个可修改副本将与内置int类型行为不同。故应该禁止使用者对返回值进行修改。 希望通过以上内容介绍,能够帮助到你。----

    1K60

    Python中sys模块功能与用法实例详解

    如果当前堆栈帧未处理异常,则从调用堆栈帧或调用者获取信息,依此类推,直到找到正在处理异常堆栈帧。这里,“处理异常”被定义为“正在执行或已执行except子句。”...警告: 将回溯返回值分配给处理异常函数局部变量将导致循环引用。这将阻止同一函数局部变量或回溯引用任何内容被垃圾回收。...调用函数后, exc_info()将返回三个None值,直到在当前线程中引发另一个异常,或者执行堆栈返回到正在处理另一个异常帧。 仅在少数几个不明显情况下才需要功能。...sys.getrecursionlimit() 返回递归限制的当前值,即Python解释器堆栈最大深度。限制可防止无限递归导致C堆栈溢出并导致Python崩溃。...调用配置文件功能; arg是将返回值,或者None 事件是由引发异常引起。 'c_call' AC功能即将被调用。这可以是扩展功能或内置功能。 arg是C函数对象。

    2K10

    如何保护 Windows RPC 服务器,以及如何不保护。

    它为接口分配一个 SD,当在该接口上进行调用时,调用者令牌根据 SD 进行检查,并且只有在检查通过时才授予访问权限。...第二个参数IfCallback采用RPC_IF_CALLBACK函数指针。这个回调函数会在调用接口时被调用,虽然它会在检查 SD 之后被调用。...如果回调函数返回 RPC_S_OK那么调用将被允许,其他任何东西都会拒绝调用。回调获取指向接口和绑定句柄指针,并且可以进行各种检查以确定是否允许调用者访问接口。...其次,检查对 RPC 服务器接口注册函数之一调用,在 InitializeLsaExtension中有一个对 RpcServerRegisterIfEx调用。这允许调用者指定安全回调而不是 SD。...InitializeLsaExtension函数也没有指定两个安全标志中任何一个(它设置 没有 任何安全影响RPC_IF_AUTOLISTEN )。这意味着通常允许任何经过身份验证调用者

    3.1K20
    领券