C#中有没有信号处理机制?

iamybj 2011-01-27 06:10:30
我写了一个程序,被另一个程序调用,在调用的时候,那个程序会kill掉所有同名的进程来防止多个实例。
不过这个程序在关闭时本来应该做一个收尾处理,但是在这种情况下由于是被kill掉的,所以无法执行这个收尾的工作。
C#中有没有UNIX/Linux中的那种信号处理机制,只要不是term和pause关闭,程序都可以自己捕获信号,并且作出处理。
如果有这样的机制,就可以在收到kill信号的时候,我的C#程序就可以在信号处理方法中执行收尾处理的工作。
...全文
663 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
枫桦沐阳 2011-01-31
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 iamybj 的回复:]
windows没这机制???
那windows关机的时候,为什么会等待一个时间,让后在弹出对话框问要不要强制关闭在规定时间内还没有关闭的程序???
肯定也有一个类似un……
[/Quote]

这个机制很简单,可以简单的理解为给程序发一个关闭消息,用postmessage 或者 sendmessage, 然后继续检索进程是不是存在,一定时间还没关闭就强制杀掉进程。

其实还是用上边所说的知识,只要你想完成多个进程的同步,所用的知识就是那些。
linux的signal我感觉就是windows的mutex, 跟event更像些,但event是控制多线程的,不是多进程的。
米的向日葵 2011-01-31
  • 打赏
  • 举报
回复
if your application is in console,try this

[DllImport("Kernel32")]
private static extern bool SetConsoleCtrlHandler(EventHandler handler, bool add);

private delegate bool EventHandler(CtrlType sig);
static EventHandler _handler;

enum CtrlType
{
CTRL_C_EVENT = 0,
CTRL_BREAK_EVENT = 1,
CTRL_CLOSE_EVENT = 2,
CTRL_LOGOFF_EVENT = 5,
CTRL_SHUTDOWN_EVENT = 6
}

private static bool Handler(CtrlType sig)
{
switch (sig)
{
case CtrlType.CTRL_C_EVENT:
case CtrlType.CTRL_LOGOFF_EVENT:
case CtrlType.CTRL_SHUTDOWN_EVENT:
case CtrlType.CTRL_CLOSE_EVENT:
default:
}
}


static void Main(string[] args)
{
// Some biolerplate to react to close window event
_handler += new EventHandler(Handler);
SetConsoleCtrlHandler(_handler, true);
...
}
  • 打赏
  • 举报
回复
唉,看来就不应该告诉你“你的程序如何通知其它被kill的程序消息”,而是直接告诉你“windows下杀进程的api不提供什么信号”,告诉你不能做,而不应该告诉你如何做。
  • 打赏
  • 举报
回复
[Quote=引用楼主 iamybj 的回复:]
我写了一个程序,被另一个程序调用,在调用的时候,那个程序会kill掉所有同名的进程来防止多个实例。
不过这个程序在关闭时本来应该做一个收尾处理,但是在这种情况下由于是被kill掉的,所以无法执行这个收尾的工作。
C#中有没有UNIX/Linux中的那种信号处理机制,只要不是term和pause关闭,程序都可以自己捕获信号,并且作出处理。
如果有这样的机制,就可以在收到kill信号的时候,我的……
[/Quote]

你自己杜撰了一个windows平台“kill信号”,然后就没有下文了。
dylike 2011-01-30
  • 打赏
  • 举报
回复
可能楼主是想在进程被结束或挂起时进行一定的清理工作.这个似乎可以通过拦截消息或者HOOKAPI来操作吧...没试过....
足球中国 2011-01-30
  • 打赏
  • 举报
回复
System.Diagnostics.Process.GetCurrentProcess ().ExitCode 这个是c#下面的退出代码。
足球中国 2011-01-30
  • 打赏
  • 举报
回复
windows有一个api是获取进程退出原因的。你可根据返回代码。看一下。他是如何退出的。
兔子-顾问 2011-01-30
  • 打赏
  • 举报
回复
可以把进程的ID当作信号来同步,WaitForSignalObject,在你上一个帖子中已经回答过了,但的确不可以在另一个进程中释放你这个进程的资源。

不过c#写的程序,你不需要释放,你的内存都是基于.net clr的,程序崩溃或被强制关闭,clr作为操作系统的进程之一,释放后,操作系统会将其占用的内存回收。

以上的前提都是简单的行为。


如果你内部使用到了DeviceIoControl,VirtualMalloc等,的确就内存泄漏了。无法避免。
iamybj 2011-01-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sp1234 的回复:]

唉,看来就不应该告诉你“你的程序如何通知其它被kill的程序消息”,而是直接告诉你“windows下杀进程的api不提供什么信号”,告诉你不能做,而不应该告诉你如何做。
[/Quote]

windows没这机制???
那windows关机的时候,为什么会等待一个时间,让后在弹出对话框问要不要强制关闭在规定时间内还没有关闭的程序???
肯定也有一个类似unix signal的机制。
iamybj 2011-01-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zjx198934 的回复:]

引用 8 楼 iamybj 的回复:

靠,楼上说的一堆没一个说到点子上的。
我说的不是进程间通信,而是signal,是指程序在被使用kill等命令关闭、挂起、暂停等时,程序会收到操作系统的signal,这个程序会被挂起,然后执行序列跳转到程序里处理这个信号的代码去执行。


一个应用程序工作在一个进程上 你的需求是一个进程的应用程序调用另一个进程的应用程序
不是进程的通信是什么?……
[/Quote]

哥们去学习学习系统级别编程再来回答问题。
进程间通讯,需要的是两个进程事先商量好了规则,都必须有对应的代码,我说的这里的信号,是指一个操作系统平台上的进程模型,unix的信号就好比windows下的消息循环!
wllllll 2011-01-28
  • 打赏
  • 举报
回复
2楼已经说到结局了


也可以使用DLL共享内存,会更麻烦。
--
DLL的共享内存, 任何程序, 只要DLL相同或者EXE相同, 那么他们共享内存中的数据都是相同的, 用他来做同进程通讯很不错, 很多游戏不允许双开都是这东西实现的.

SendMessage()
发送一个关闭窗体的消息给进程,进程就会关闭窗体,关闭窗体和正常关闭产生的过程是一样的.

TCP
最后用TCP了, 其实比内存共享还麻烦
zjx198934 2011-01-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 iamybj 的回复:]

靠,楼上说的一堆没一个说到点子上的。
我说的不是进程间通信,而是signal,是指程序在被使用kill等命令关闭、挂起、暂停等时,程序会收到操作系统的signal,这个程序会被挂起,然后执行序列跳转到程序里处理这个信号的代码去执行。
[/Quote]

一个应用程序工作在一个进程上 你的需求是一个进程的应用程序调用另一个进程的应用程序
不是进程的通信是什么? 只要能通信 你还认为有什么你不能操作的吗?
iamybj 2011-01-28
  • 打赏
  • 举报
回复
靠,楼上说的一堆没一个说到点子上的。
我说的不是进程间通信,而是signal,是指程序在被使用kill等命令关闭、挂起、暂停等时,程序会收到操作系统的signal,这个程序会被挂起,然后执行序列跳转到程序里处理这个信号的代码去执行。
zhubo006 2011-01-28
  • 打赏
  • 举报
回复
枫桦沐阳 2011-01-27
  • 打赏
  • 举报
回复
楼上说的进程间通信, 确实也可以当信号来变通使用.

挺一下!!
wuyq11 2011-01-27
  • 打赏
  • 举报
回复
带有消息机制的线程 - CustomMessageQueue
多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent
进程间通信
protected override void DefWndProc(ref Message m)
{
switch (m.Msg)
{
case WM_COPYDATA:
string message = ReveiveMessage(ref m); //message为接受到的消息内容
MessageBox.Show(message);
break;
default:
base.DefWndProc(ref m);
break;
}
}

public static string ReveiveMessage(ref System.Windows.Forms.Message m)
{
COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
return cds.lpData;
}

[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
Windows进程间通信的各种方法
  • 打赏
  • 举报
回复
管道是windows系统标准的进程间通信方式,不仅.net进程之间,各种windows的进程之间相互通信都可以。
  • 打赏
  • 举报
回复
关于命名管道,可以看msdn: http://msdn.microsoft.com/zh-cn/library/bb546085.aspx
枫桦沐阳 2011-01-27
  • 打赏
  • 举报
回复
你要实现的是进程间的同步,C#好像没有简单的办法。
可以使用系统API CreateMutex函数,可以达到要求。

也可以使用DLL共享内存,会更麻烦。

还有一招就是发送消息,sendmessage(),C#内万不得已一般不会用吧。。
  • 打赏
  • 举报
回复
.net可以使用命名管道或者tcp等。

111,095

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧