如果我有一个使用线程运行的程序并fork()在基于 unix 的系统上调用,线程是否被复制?我知道当前进程的虚拟内存以 1:1 的比例复制到生成的新进程中。我知道线程在进程的虚拟内存中有自己的堆栈。因此,至少也应该复制线程堆栈。但是,我不知道不驻留在虚拟内存中的线程是否还有其他内容,因此不会被复制。如果没有,这两个进程是共享线程还是独立的副本?
我正在将命令行上的pid传递给子进程,但有没有办法在Win32 API中执行此操作?或者,有人可以减轻我的担心,如果父母已经去世,我经过的pid可能会在一段时间后属于另一个过程吗?
我希望能够监视进程发出的某些系统调用,主要是文件I/O调用.在Linux上,我可以使用带有合适参数的strace来逃避,但我怎样才能在Windows上执行此操作?
我主要对运行一个进程并确定它已经读取和写入的文件感兴趣.
编辑:我想从另一个进程以编程方式执行此操作.我知道ProcessMonitor,但我希望以一种形式接收数据,我可以将其导入另一个程序以进行进一步分析.
编辑:如果我进一步缩小我的要求,它可能足以监视对CreateFile()的调用.我真的只对打开的文件感兴趣,如果打开它们进行读/写或只是阅读.我没有说明的另一个要求是速度相当重要; 我正在计划为编译C++文件这样做,并且提取一个生成20MB日志文件的完整GUI会产生过高的开销.
编辑:如果它不需要管理权限也会很好.
我想用批处理文件启动一个进程,如果它返回非零,则执行其他操作.我需要正确的语法.
像这样的东西:
::x.bat
@set RetCode=My.exe
@if %retcode% is nonzero
handleError.exe
Run Code Online (Sandbox Code Playgroud)
作为奖励,您可以考虑回答以下问题,请:)
if?My.exe无法启动因为某些DLL丢失,我的工作是否正常?如果没有,我怎么能检测到My.exe无法启动?因为vsinstr -coverage hello.exe,我可以使用C#代码如下.
Process p = new Process();
StringBuilder sb = new StringBuilder("/COVERAGE ");
sb.Append("hello.exe");
p.StartInfo.FileName = "vsinstr.exe";
p.StartInfo.Arguments = sb.ToString();
p.Start();
p.WaitForExit();
Run Code Online (Sandbox Code Playgroud)
当出现错误时,我收到错误消息:Error VSP1018: VSInstr does not support processing binaries that are already instrumented..
如何使用C#获取此错误消息?
我可以从答案中获取错误消息.
using System;
using System.Text;
using System.Diagnostics;
// You must add a reference to Microsoft.VisualStudio.Coverage.Monitor.dll
namespace LvFpga
{
class Cov2xml
{
static void Main(string[] args)
{
Process p = new Process();
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.UseShellExecute = …Run Code Online (Sandbox Code Playgroud) 我们想检查当前是否通过PHP运行指定的进程.
我们想简单地提供一个PID并查看它当前是否正在执行.
PHP有一个内部函数可以提供给我们这些信息,还是我们必须从"ps"输出中解析它?
我知道要接收有关Win32进程创建或终止的通知,我们可以使用API实现NT内核模式驱动程序,该驱动程序PsSetCreateProcessNotifyRoutine()能够注册系统范围的回调函数,每当新进程启动,退出或者被终止.
这是否可以在不创建NT内核模式驱动程序的情况下,仅使用使用c ++的Win32 API函数?当然,不使用无限循环的基本解决方案查询活动进程列表.
是否有任何库或win32 API提供相同的功能(系统范围的回调,异步事件)?
我执行了以下命令
$ nohup ./tests.run.pl 0 &
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试使用时将其杀死(以及从此脚本启动的执行)
$ kill -0 <process_id>
Run Code Online (Sandbox Code Playgroud)
这是行不通的.如何杀死nohupped进程以及通过nohupped脚本运行的进程?
谢谢
所以,我已经习惯了fork(),我知道它做了什么.作为初学者,我非常害怕它(我仍然不完全理解它).fork()你可以在网上找到的一般描述是,它复制当前进程并分配不同的PID,父PID和进程将有不同的地址空间.一切都很好,但是,鉴于这个功能描述,初学者会想知道"为什么这个功能如此重要......为什么我要复制我的过程?".所以我确实很奇怪,最终我发现你可以通过execve()家庭来调用当前流程中的其他流程.
我仍然不明白为什么你必须这样做?最合乎逻辑的是拥有一个可以调用的函数
create_process("executable_path+name",params..., more params);
Run Code Online (Sandbox Code Playgroud)
这会生成一个新进程并在main()的开头运行它并返回新的PID.
困扰我的是fork/execve解决方案正在进行可能不需要的工作的感觉.如果我的进程使用大量内存怎么办?内核是否复制了我的页面表等.我确信它不会真正分配实际内存,除非我触及它.另外,如果我有线程会发生什么?在我看来,它太乱了.
几乎所有关于fork的描述,比如它只是复制进程并且新进程在fork()调用之后开始运行.这确实发生了什么,但为什么会这样发生?为什么fork/execve是产生新进程的唯一方法,以及从当前创建新进程的最常用的unix方法是什么?有没有其他更有效的方法来产生进程?**这不需要复制更多的内存.
这个帖子谈到同样的问题,但我发现它不太令人满意:
谢谢.
上下文:我正在获取当前的Ruby进程ID.
Process.pid #=> 95291
Process.ppid #=> 95201
Process.uid #=> 501
Process.gid #=> 20
Process.euid #=> 501
Process.egid #=> 20
Run Code Online (Sandbox Code Playgroud)