What are the differences between kill process and close process?

When I start a process and want to close this process, what are the differences between Process.Close() and Process.Kill()?

I asked because I have an application which starts to capture packet using Wireshark with a command via command line with Windows = hidden. so when I want to stop the capturing I kill the process .So sometimes the capture opens with an error that the last packet was cut in the middle so I am wondering can using close() before kill() will solve this issue ?

When I start capturing I can close it by pressing Ctrl + C but in my case I open the window in hidden state, Can I do something similar via my code ?


Solution 1:

What are the differences between Process.Close() and process.Kill()?

The manual is pretty clear on that:

Process.Close():

The Close method causes the process to stop waiting for exit if it was waiting, closes the process handle, and clears process-specific properties. Close does not close the standard output, input, and error readers and writers in case they are being referenced externally. [i.e. the process itself keeps running, you just cannot control it anymore using your Process instance]

Process.Kill():

Kill forces a termination of the process, while CloseMainWindow only requests a termination. [...] The request to exit the process by calling CloseMainWindow does not force the application to quit. The application can ask for user verification before quitting, or it can refuse to quit. To force the application to quit, use the Kill method. The behavior of CloseMainWindow is identical to that of a user closing an application's main window using the system menu. Therefore, the request to exit the process by closing the main window does not force the application to quit immediately.

Process.CloseMainWindow:

Closes a process that has a user interface by sending a close message to its main window.


As for your edit:

i asked because i have application who start to capture packet using wireshark with command via command line with Windows = hidden.

Use the WinPcap API or the Pcap.Net library for that, not Wireshark.

Solution 2:

Kill asks the system to unceremoniously terminate the process (via a call to the Windows TerminateProcess system call). This is akin to End Process in Task Manager.

Close closes the handle to the process in .NET, but does not actually touch the process itself. Close is also called by Dispose. See this answer by Jon Skeet.

A third option is CloseMainWindow, which does gracefully shut down the program by asking the primary window to close. This is akin to right-clicking the program on the task bar and choosing Close.

Solution 3:

Kill and Close are not two options. Kill (or CloseMainWindow) must be called if you want to terminate a process. Calling Close will just free resources, but it won't close the standard streams. Closing the streams yourself may or may not cause the process to end, it depends on the process. The best strategy is to call Kill or CloseMainWindow depending on the type of process and then Dispose the Process object.

Close begins closing the Process object. It's called by Dispose. Close is generally used for managing the Process object's resources.

Kill terminates the process. This is the only way to terminate a process that has no user interface.

CloseMainWindow sends a close message to the main window of the process. This is the graceful way to stop a process that has a user interface.

Solution 4:

Let me illustrate what happens visually when you call Close() and Kill() . The following will open Notepad but does not exit the notepad at the end when myProcess.Close() executes.

Process myProcess;
myProcess = Process.Start("Notepad.exe");
Thread.Sleep(10000);
myProcess.Close();

the following will open Notepad. after 10 seconds the notepad will close at the end when myProcess.Kill() executes.

Process myProcess;
myProcess = Process.Start("Notepad.exe");
Thread.Sleep(10000);
myProcess.Kill();

Solution 5:

Process.Kill calls TerminateProcess.

Process.Close doesn't do what you think it does! It simply frees resources used by the instance of the class. Please read this: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.close.aspx