Questions tagged «exec»

exec()系列函数将当前过程映像替换为新过程映像,并保留了旧过程的pid和管道。此标记还用于内置的shell,可用于用程序或各种与重定向相关的东西替换当前的shell。


4
当我在shell中执行文件时,会发生什么情况?
所以,我以为我对此有很好的了解,但是只是进行了一次测试(以回应我不同意某人的对话),发现我的理解是有缺陷的... 尽可能详细地说明我在Shell中执行文件时会发生什么情况?我的意思是,如果我键入以下内容:如果./somefile some arguments在外壳中键入内容,然后按return键(somefile并存在于cwd中,并且我具有的读取和执行权限somefile),那么在幕后会发生什么? 我以为答案是: Shell进行syscall exec,将路径传递给somefile 内核检查somefile并查看文件的幻数,以确定它是否是处理器可以处理的格式 如果幻数表示文件是处理器可以执行的格式,则 创建一个新流程(在流程表中有一个条目) somefile被读取/映射到内存。创建一个堆栈,执行跳转到的代码的入口点somefile,并ARGV初始化为参数数组(a char**,["some","arguments"]) 如果幻数是shebang,则exec()如上所述产生一个新进程,但是使用的可执行文件是shebang引用的解释器(例如/bin/bash或/bin/perl),somefile并传递给STDIN 如果文件没有有效的幻数,则发生类似“无效文件(不良幻数):执行格式错误”的错误 但是有人告诉我,如果文件是纯文本,那么Shell会尝试执行命令(就像我键入一样bash somefile)。我不相信这一点,但我只是尝试了一下,这是正确的。因此,我显然对这里实际发生的事情有一些误解,并且想了解其机制。 当我在shell中执行文件时,会发生什么情况?(尽可能多的细节是合理的...)
32 shell  kernel  exec  shebang 


2
包装脚本中执行的原因
我看过以下概括的包装器脚本示例: #!/bin/bash myprog=sleep echo "This is the wrapper script, it will exec "$myprog"" exec "$myprog" "$@" 如上所示,它们用于exec几乎立即用替换新创建的外壳$myprog。如果没有exec以下内容,则可以实现相同的目的: #!/bin/bash myprog=sleep echo "This is the wrapper script, it will exec "$myprog"" "$myprog" "$@" 在最后一个示例中,启动了一个新的bash实例,然后$myprog将其作为bash实例的子进程启动。 第一种方法的好处是什么?
27 bash  exec 

2
POSIX是否保证任何标准实用程序的路径?
从C语言开始,运行标准实用程序(例如ps)而没有其他方法的最简单方法是什么? POSIX是否保证例如已存在标准ps,/bin/ps还是应该将PATH环境变量重置为所获得的内容confstr(_CS_PATH, pathbuf, n);,然后通过PATH搜索运行该实用程序?
22 path  c  posix  exec 

2
是否有设置目标应用程序第零个参数的POSIX方法?
在中,bash您还可以使用exec -a和中的zsh选项来设置ARGV0执行带有特定第零个参数的程序,但是还有POSIX方法吗? 如该注释中所建议,您可以创建一个(临时)符号链接来实现此目的,但是通过这种方式,我无法将新的第零个参数值设置为真正的任意值,例如具有某个绝对路径的命令。那么还有其他解决方案吗?

3
如何从外壳“正确”启动应用程序
我很难精确地表达问题,但我会尽力而为。我使用dwm默认的窗口管理器dmenu作为我的应用程序启动器。除了浏览器外,我几乎不使用GUI应用程序。我的大部分工作都是直接从命令行完成的。此外,我非常热衷于有关操作系统,应用程序等的极简主义。我从未遗弃的工具之一是应用程序启动器。主要是因为我对应用程序启动器的工作方式/工作方式缺乏确切的了解。即使是广泛的互联网搜索也只能显示模糊的解释。我想做的就是摆脱我的应用程序启动器,因为除了实际生成应用程序之外,我对此完全没有用。为了做到这一点,我真的很想知道如何从外壳“正确”启动应用程序。因此,“正确”的含义可以近似为“像应用程序启动程序那样”。 我知道以下几种从shell生成进程的方法: exec /path/to/Program 用指定的命令替换shell而不创建新进程 sh -c /path/to/Program 启动依赖于外壳的进程 /path/to/Program 启动依赖于外壳的进程 /path/to/Program 2>&1 & 启动外壳独立进程 nohup /path/to/Program & 启动独立于Shell的进程并将输出重定向到 nohup.out 更新1:我可以举例说明在不同条件下dmenu从重复调用到重新构造它的方法ps -efl。它产生一个新的shell,/bin/bash并作为该shell的子级应用程序/path/to/Program。只要孩子在身边,壳就会在附近。(如何管理它超出了我的范围...)相反,如果您nohup /path/to/Program &从shell 发出,/bin/bash则该程序将成为该shell的子级,但如果退出该shell,则该程序的父级将是最高级的进程。因此,如果第一个进程例如是/sbin/init verbose并且已经存在,PPID 1那么它将成为程序的父级。这里就是我试图用一个图表来解释:chromium推出通过dmenu,firefox使用推出exec firefox & exit: systemd-+-acpid |-bash---chromium-+-chrome-sandbox---chromium-+-chrome-sandbox---nacl_helper | | `-chromium---5*[chromium-+-{Chrome_ChildIOT}] | | |-{Compositor}] | | |-{HTMLParserThrea}] | | |-{OptimizingCompi}] | | `-3*[{v8:SweeperThrea}]] | |-chromium | …
21 shell  exec 

4
fork和exec如何工作?
我没有太多的经验,只是试图参与到流程中,它们如何从用户级别解释为硬件。 因此,当从外壳启动命令时fork(),它将继承该命令的子进程并将exec()该子进程加载到内存中并执行。 如果子流程包含父流程(原始流程)的所有属性,那么该子流程有什么需求?原始进程也可能已加载到内存中。 这fork和exec概念适用于UNIX中的所有可执行程序吗?是否也喜欢用于shell脚本或仅用于命令?它也适用于shell内置命令吗? 如果我将执行命令/脚本,何时使用写时复制概念? 抱歉一次问很多问题,但是当我想到任何命令执行时,所有这些问题立刻浮现在脑海。
17 fork  exec 

6
脚本启动后选择解释器,例如if / else在hashbang中
有没有办法动态选择正在执行脚本的解释器?我有一个在两个不同系统上运行的脚本,并且我要使用的解释器位于两个系统上的不同位置。我最终必须要做的是每次切换时都更改hashbang行。我愿做一些事情,是合乎逻辑的该等效(我知道这个确切的结构是不可能的): if running on system A: #!/path/to/python/on/systemA elif running on system B: #!/path/on/systemB #Rest of script goes here 甚至更好的是,它尝试使用第一个解释器,如果找不到,则使用第二个: try: #!/path/to/python/on/systemA except: #!path/on/systemB #Rest of script goes here 很显然,我可以代替执行它 /path/to/python/on/systemA myscript.py 还是 /path/on/systemB myscript.py 取决于我在哪里,但我其实有一个包装脚本启动myscript.py,所以我想以指定Python解释器编程而不是手工的路径。

1
exec 3 <&1做什么?
我知道exec可以在当前shell上进行I / O重定向,但是我只会看到类似的用法: exec 6&lt;&amp;0 # Link file descriptor #6 with stdin. # Saves stdin. exec 6&gt;&amp;1 # Link file descriptor #6 with stdout. # Saves stdout. 据此,我了解&lt;输入流,&gt;输出流。那怎么exec 3&lt;&amp;1办? PS:我从Bats源代码中找到了这个

6
Linux Ubuntu上的php shell_exec()权限
我正在使用Linux服务器开发php应用程序。我的问题是执行shell_exec()调用某些exe文件不起作用(实际上不是exe,这是Linux可执行文件) echo shell_exec("whoami"); 我有守护进程 echo shell_exec("ls") 我有一些文件名,但是 echo shell_exec("php -v") 我什么也没有,空白页 echo shell_exec("php ....bla bla bla") 也有一个空白页。 如果我在终端(用户hu)上键入所有这些命令,将可以使用。我已经在Google上搜索了几个小时,有人说是出于允许。我没有Linux经验。我必须怎么做才能在php中执行程序?
13 linux  shell  php  exec 


3
为什么我们必须在exec函数中两次传递文件名?
我读了第 8 章的Stevens撰写的《 UNIX环境中的高级编程》。我阅读并理解了exec函数的全部六个。 我注意到的一件事是,在所有exec函数中: 第一个参数是文件名/路径名(取决于exec函数)。 第二个参数是我们输入的argv [0] main(),它是文件名本身。 因此,这里我们必须在函数中两次传递文件名。 是否有任何原因(例如我们无法从第一个参数的路径名中获取文件名)?


2
为什么在创建子进程后立即调用exec()或exit()时使用vfork()?
操作系统概念和APUE说 通过vfork(),父进程被挂起,子进程使用父进程的地址空间。由于vfork()不使用写时复制,因此,如果子进程更改了父级地址空间的任何页面,则父级恢复后更改后的页面将对父级可见。因此,必须谨慎使用vfork(),以确保子进程不会修改父进程的地址空间。 vfork()旨在在子进程创建后立即调用exec()或exit()时使用。 我如何理解最后一句话? 当通过vfork()调用创建的子进程时exec(),是否exec()通过加载新程序来修改父进程的地址空间? 当通过vfork()调用创建子进程时,终止子进程时exit()是否 exit()不修改父进程的地址空间? 我偏爱Linux。 谢谢。
11 linux  process  exec  exit  vfork 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.