进程Process

进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。进程之间是相对独立的,一个进程无法直接访问另一个进程的数据(除非分布式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的。

  进程可以理解为一个程序的基本边界。

一、Process的常用属性与方法

  在System.Diagnostics命名空间当中存在Process类,专门用于管理进程的开始、结束,访问进程中的模块,获取进程中的线程,设定进程的优先级别等。

  Process类常用属性:

属性 说明
BasePriority 获取关联进程的基本优先级。
ExitCode 获取关联进程终止时指定的值。
ExitTime 获取关联进程退出的时间。
Handle 返回关联进程的本机句柄。
HandleCount 获取由进程打开的句柄数。
HasExited 获取指示关联进程是否已终止的值。
Id 获取关联进程的唯一标识符。
MachineName 获取关联进程正在其上运行的计算机的名称。
MainModule 获取关联进程的主模块。
Modules 获取已由关联进程加载的模块。
PriorityClass 获取或设置关联进程的总体优先级类别。
ProcessName 获取该进程的名称。
StartInfo 获取或设置要传递给Process的Start方法的属性。
StartTime 获取关联进程启动的时间。
SynchronizingObject 获取或设置用于封送由于进程退出事件而发出的事件处理程序调用的对象。
Threads 获取在关联进程中运行的一组线程

  Process类常用方法:

方法 说明
GetProcessById 创建新的 Process 组件,并将其与您指定的现有进程资源关联。
GetProcessByName 创建多个新的 Process 组件,并将其与您指定的现有进程资源关联。
GetCurrentProcess 获取新的 Process 组件并将其与当前活动的进程关联。
GetProcesses 获取本地计算机上正在运行的每一个进程列表。
Start 启动一个进程。
Kill 立即停止关联的进程。
Close 释放与此组件关联的所有资源。
WaitForExit 指示 Process 组件无限期地等待关联进程退出。

  Microsoft关于Process的说明:http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.aspx

二、信息传递

  StartInfo这个属性专门用于传递信息到被调用的程序。

  其类型是:System.Diagnostics.ProcessStartInfo,MSDN地址为:http://msdn.microsoft.com/zh-cn/library/system.diagnostics.processstartinfo.aspx。

  其属性也很多,无法一一详述。

  为了展示其作用,我设计了两个控制台程序。

  第一个控制台程序代码如下:

    static void Main(string[] args)
    {
        foreach(string arg in args)
        {
            Console.WriteLine(arg);
        }
        Console.ReadKey();
    }

  然后生成,然后将其生成的exe文件的路径作为参数,放在第二个控制台程序中。

    static void Main(string[] args)
    {
        Process process = new Process();
        process.StartInfo.FileName = @"C:\Users\ChenZhuo\Desktop\MyConsoleApplication\MyConsoleApplication\bin\Debug\MyConsoleApplication.exe";
        process.StartInfo.Arguments = string.Format("姓名:刘备 年龄:26");
        process.Start();
        Console.ReadKey();
    }

  启动时输出如下:

  

  可以看到StartInfo这个属性主要用于调用程序向被调用程序传递信息。

  被调用程序的参数在Main(string[] args)这里接收,默认是通过空格分隔。

三、建立与销毁进程

  利用Start与Kill方法可以简单建立或者销毁进程,下面以一个例子:用Start方法启动记事本的进程,并打开File.txt文件。2秒钟以后使用Kill方法销毁进程并关闭记事本。然后又用google浏览器打开百度首页两秒后关闭。

    public class Program
    {
        static void Main(string[] args)
        {
            //打开记事本
            Process process = Process.Start("notepad.exe", "D:123.txt");
            Thread.Sleep(2000);
            process.Kill();

            //打开google浏览器,并打开百度
            Process process2 = Process.Start("chrome.exe", "http://www.baidu.com");
            Thread.Sleep(20000);
            process.Kill();

            Console.ReadKey();
        }
    }

  显示如下:

  

四、显示计算机运行中的进程

  使用 GetProcesses 方法可以获取本地计算机上正在运行的每一个进程列表。而进程的 Id 属性是每个进程的唯一标志,通过下面的方法,可以显示当前计算机运行的所有进程信息。

    public class Program
    {
        static void Main(string[] args)
        {
            var processList = Process.GetProcesses();
            foreach (var process in processList)
            {
                Console.WriteLine(string.Format("ProcessId is:{0} \t ProcessName is:{1}", process.Id, process.ProcessName));
            }

            Console.ReadKey();
        }
    }

  输出结果如下:

  

  如果已经知道了进程的Id,就可以通过GetProcessId方法获取对应的进程:

    public class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Process p = Process.GetProcessById(6888);
                Console.WriteLine(p.ProcessName);   //输出 QQExternal
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }

            Console.ReadKey();
        }
    }

  同样地,你也可能通过GetProcessByName方法获取多个对应名称的进程:

        static void Main(string[] args)
        {
            Process[] pArr = Process.GetProcessesByName("QQExternal");
            Console.WriteLine(pArr[0].Id);   //输出 6888

            Console.ReadKey();
        }

  注意:如果不能找到当前ID的进程,系统就会抛出ArgumentException异常。所以使用方法 GetProcessById 获取进程时应该包含在 try{...} catch{..} 之内。

五、获取进程中的多个模块

  Process类中有一个Modules属性,通过此属性可能获取进程中的多个模块。

  这些模块可以是以*.dll结尾的程序集,也可以使*.exe结尾的可执行程序。

  通过Process的GetCurrentProcess方法可以获取当前运行的进程信息,然后显示当前进程的多个模块信息。

    class Program
    {
        static void Main(string[] args)
        {
            var modulelist = Process.GetCurrentProcess().Modules;
            foreach (ProcessModule pm in modulelist)
            {
                Console.WriteLine("模块名:" + pm.ModuleName + "文件名:" + pm.FileName + "版本号:" + pm.FileVersionInfo.FileVersion);
            }

            Console.ReadKey();
        }
    }

  输出结果如下:

  

六、综合示例,进程管理器

  Process用于管理计算机的进程,下面给出一个C#进程管理器的DEMO。

namespace ProcessManager
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            listView1.FullRowSelect = true;
            GetProcess();
        }

        private void GetProcess()
        {
            listView1.Items.Clear();

            Process[] proList = Process.GetProcesses(".");//获得本机的进程
            lblNumber.Text = proList.Length.ToString(); //当前进程数量
            foreach (Process p in proList)
            {
                ListViewItem lvi = new ListViewItem();
                lvi.Text = p.ProcessName;
                lvi.SubItems.AddRange(new string[] { p.Id.ToString(), p.PrivateMemorySize64.ToString() }); //进程ID  使用内存
                listView1.Items.Add(lvi);
            }
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            if (listView1.SelectedItems.Count > 0)
            {
                try
                {
                    string proName = listView1.SelectedItems[0].Text;
                    Process[] p = Process.GetProcessesByName(proName); //根据进程命获得指定的进程
                    p[0].Kill(); //杀死该进程
                    MessageBox.Show("进程关闭成功!");
                    GetProcess();
                }
                catch
                {
                    MessageBox.Show("无法关闭此进程!");
                }
            }
            else
            {
                MessageBox.Show("请选择要终止的进程!");
            }
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            if (txtProcess.Text != string.Empty)
            {
                Process.Start(txtProcess.Text); //启动一个进程
            }
            else
            {
                MessageBox.Show("请输入启动项");
                txtProcess.Focus();
            }
        }
    }
}

  显示如下:

  

时间: 2024-10-11 09:33:19

进程Process的相关文章

java代码中获取进程process id(转)

另一方面,线程ID=进程ID+内部线程对象ID并不成立,    参考: blog.csdn.net/heyetina/article/details/6633901     如何在java代码中获取进程process id, 实现方法如下所示:    参考: rednaxelafx.iteye.com/blog/716918 http://www.cnblogs.com/mumuxinfei/p/3678854.html

进程(process)和线程(thread)

来源:阮一峰 进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握. 其实做一个很好的类比,就可以把它们解释地清晰易懂. 1.计算机的核心是CPU,它承担了所有的计算任务.它就像一座工厂,时刻在运行. 2.假定工厂的电力有限,一次只能供给一个车间使用.也就是说,一个车间开工的时候,其他车间都必须停工.背后的含义就是,单个CPU一次只能运行一个任务. 3.进程就好比工厂的车间,它代表CPU所能处理的单个任务.任一时刻,CPU总是运行一个进程,其他进程处于非

python 进程Process模块(40)

进程Process是对各种资源管理的集合,包含对各种资源的调用.内存的管理.网络接口的调用:一个进程Process可以包含多个子进程,启动一个进程的时候会自动创建一个线程,进程里的第一个线程就是主线程(即python __name__ == ‘__main__’): 二.进程Process模块 对于线程操作可以用threading模块,那么对于进程的创建python同样也提供了Process模块,创建进程时需要导入该模块,语法如下: # 导入进程模块 from multiprocessing i

你知道进程(Process)是什么吗?

对应用程序来说,进程就像一个大容器.在应用程序被运行后,就相当于将应用程序装进容器里了,你可以往容器里加其他东西(如:应用程序在运行时所需的变量数据.需要引用的DLL文件等),当应用程序被运行两次时,容器里的东西并不会被倒掉,系统会找一个新的进程容器来容纳它.一个进程可以包含若干线程(Thread),线程可以帮助应用程序同时做几件事(比如一个线程向磁盘写入文件,另一个则接收用户的按键操作并及时做出反应,互相不干扰),在程序被运行后中,系统首先要做的就是为该程序进程建立一个默认线程,然后程序可以根

nodejs的进程process

process是一个全局变量,可以直接调用. process的属性,如下: version:包含当前node实例的版本号: installPrefix:包含安装路径: platform:列举node运行的操作系统的环境,只会显示内核相关的信息,如:linux2, darwin,而不是"Redhat ES3" ,"Windows 7","OSX 10.7"等: pid:获取进程id: title:设置进程名称: execPath:当前node进程的

[Android] 进程(Process)和线程(Thread)

当应用的某一个组件(四大组件:Activity,Service,BroadcastReceiver,ContentProvider)启动同时应用没有其他的组件正在运行,也就是说应用的第一个组件启动的时候,安卓系统为这个应用开启一个新的Linux进程,这个进程中包含一个线程.默认情况下,一个应用的所有组件都运行在同一个进程的同一个线程下,这个线程叫主线程.但是不同的组件可以被人为地安排在不同的进程中,同时以可以为一个进程创建额外的线程. 进程 默认情况下,一个应用的所有组件都运行在同一个进程中,而

进程---Process

#! /usr/bin/env python# -*- coding:utf-8 -*- """ python中的多线程其实并不是真正的多线程(全局解释器锁(GIL)存在) 多进程包multiprocessing:可以轻松完成从单进程到并发执行的转换 multiprocessing支持子进程.通信和共享数据.执行不同形式的同步,提供了Process.Queue.Pipe.Lock等组件"""import multiprocessingimport

计算机必知必会:进程process与线程thread 进程定义为一个正在运行的程序的实例

http://www.nowamagic.net/librarys/veda/detail/1741进程和线程这对概念的理解也是很难的,至今网络上可查的资料对其的理解出入都挺大,在不同的操作系统中,如linux和windows中,其概念和实现都是有出入的.因此,我在这里结合我自己的理解谈下这两个概念,讲的都是一般性的概念,并且主要是基以WINDOWS的. 一般将进程定义为一个正在运行的程序的实例.我们在任务管理器重所看到的每一项,就可以理解为一个进程,每个进程都有一个地址空间,这个地址空间里有可

Node.js API —— process(进程)

// 说明 Node API 版本为 v0.10.31.    中文参考:http://nodeapi.ucdok.com/#/api/,http://blog.sina.com.cn/oleoneoy 本段为博主注解. 目录 ● 进程    ○ Event: 'exit'    ○ Event: 'uncaughtException'    ○ Signal Events    ○ process.stdout    ○ process.stderr ○ process.stdin ○ pro