我写了一个程序,被另一个程序调用,在调用的时候,那个程序会kill掉所有同名的进程来防止多个实例。
不过这个程序在关闭时本来应该做一个收尾处理,但是在这种情况下由于是被kill掉的,所以无法执行这个收尾的工作。
C#中有没有UNIX/Linux中的那种信号处理机制,只要不是term和pause关闭,程序都可以自己捕获信号,并且作出处理。
如果有这样的机制,就可以在收到kill信号的时候,我的C#程序就可以在信号处理方法中执行收尾处理的工作。
不过这个程序在关闭时本来应该做一个收尾处理,但是在这种情况下由于是被kill掉的,所以无法执行这个收尾的工作。
C#中有没有UNIX/Linux中的那种信号处理机制,只要不是term和pause关闭,程序都可以自己捕获信号,并且作出处理。
如果有这样的机制,就可以在收到kill信号的时候,我的C#程序就可以在信号处理方法中执行收尾处理的工作。
解决方案 »
- 我在windows 7 64位 内存18G下插入数据,但是每次插入到内存为14G是程序就退出,这是什么情况???
- socket如何接收不定长数据包
- 新手求vs2008复合控件开发过程(详细步骤)
- c# 怎么实现像QQ登陆界面一样记录登陆帐号
- c#中怎么写结构体??急~~
- C#2005中判断一个Object是一个Button还是Label或是其他.
- 服务器错误。
- 解释一下“类型参数化”
- C# 串口数据读取和处理的困惑
- 如何把一个自定义的类对象写进一个文件
- 请问ant脚本是否支持远程发布应用到weblogic??
- DX控件高手请帮帮我.gridcontrol 绑定list,关于更改列名,或者隐藏列,谢谢大家
可以使用系统API CreateMutex函数,可以达到要求。也可以使用DLL共享内存,会更麻烦。还有一招就是发送消息,sendmessage(),C#内万不得已一般不会用吧。。
多线程之线程同步中的信号量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进程间通信的各种方法
我说的不是进程间通信,而是signal,是指程序在被使用kill等命令关闭、挂起、暂停等时,程序会收到操作系统的signal,这个程序会被挂起,然后执行序列跳转到程序里处理这个信号的代码去执行。
也可以使用DLL共享内存,会更麻烦。
--
DLL的共享内存, 任何程序, 只要DLL相同或者EXE相同, 那么他们共享内存中的数据都是相同的, 用他来做同进程通讯很不错, 很多游戏不允许双开都是这东西实现的.SendMessage()
发送一个关闭窗体的消息给进程,进程就会关闭窗体,关闭窗体和正常关闭产生的过程是一样的.TCP
最后用TCP了, 其实比内存共享还麻烦
哥们去学习学习系统级别编程再来回答问题。
进程间通讯,需要的是两个进程事先商量好了规则,都必须有对应的代码,我说的这里的信号,是指一个操作系统平台上的进程模型,unix的信号就好比windows下的消息循环!
你自己杜撰了一个windows平台“kill信号”,然后就没有下文了。
如果你内部使用到了DeviceIoControl,VirtualMalloc等,的确就内存泄漏了。无法避免。
windows没这机制???
那windows关机的时候,为什么会等待一个时间,让后在弹出对话框问要不要强制关闭在规定时间内还没有关闭的程序???
肯定也有一个类似unix signal的机制。
这个机制很简单,可以简单的理解为给程序发一个关闭消息,用postmessage 或者 sendmessage, 然后继续检索进程是不是存在,一定时间还没关闭就强制杀掉进程。其实还是用上边所说的知识,只要你想完成多个进程的同步,所用的知识就是那些。
linux的signal我感觉就是windows的mutex, 跟event更像些,但event是控制多线程的,不是多进程的。
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);
...
}