使用setjmp()&longjmp()实现多线程

合集下载

setjmp 和 longjmp 函数使用详解

setjmp 和 longjmp 函数使用详解
}
void first(void) {
second();
printf("first\n"); // 不可能执行到此行
}
int main() {
if ( ! setjmp(buf) ) {
first(); // 进入此行前,setjmp返回0
上述程序将输出:
second
main
12
secondmain
注意到虽然first()子程序被调用,”first“不可能被打印。”main“被打印,因为条件语句if ( ! setjmp(buf) )被执行第二次。
void longjmp(jmp_buf env,int val);
1
void longjmp(jmp_buf env,int val);
调用此函数则返回到语句setjmp所在的地方,其中env 就是setjmp中的 env,而val 则是使setjmp的返回值变为val。
} else { // 当longjmp跳转回,setjmp返回1,因此进入此行
printf("main\n"); // 打印
}
return 0;
}
123456789101112131415161718192021222324
2. longjmp必须在setjmp调用之后,而且longjmp必须在setjmp的作用域之内。具体来说,在一个函数中使用setjmp来初始化一个全局标号,然后只要该函数未曾返回,那么在其它任何地方都可以通过longjmp调用来跳转到 setjmp的下一条语句执行。实际上setjmp函数将发生调用处的局部环境保存在了一个jmp_buf的结构当中,只要主调函数中对应的内存未曾释放 (函数返回时局部内存就失效了),那么在调用longjmp的时候就可以根据已保存的jmp_buf参数恢复到setjmp的地方执行。

c语言异常处理机制

c语言异常处理机制

c语言异常处理机制C语言异常处理机制异常处理是计算机编程中的重要概念,它允许程序在出现错误或异常情况时进行适当的处理,以保证程序的稳定性和可靠性。

在C语言中,异常处理机制主要通过错误码和异常处理函数来实现。

本文将详细介绍C语言异常处理机制的原理和使用方法。

一、错误码在C语言中,错误码是用来表示程序执行过程中出现错误的一种机制。

当程序执行过程中发生错误时,相应的错误码会被设置为一个特定的值,以便程序能够根据错误码来进行相应的处理。

C语言中常用的错误码包括0表示成功,其他非零值表示不同的错误类型。

例如,当打开一个文件失败时,C语言会将errno变量设置为一个非零值,以表示文件打开失败的错误码。

程序可以通过检查errno 的值来确定文件是否成功打开,并根据具体情况进行相应的处理。

二、异常处理函数异常处理函数是一种特殊的函数,用于处理程序执行过程中出现的异常情况。

在C语言中,异常处理函数通常使用setjmp和longjmp函数来实现。

setjmp函数用于设置一个跳转点,而longjmp函数则用于跳转到之前设置的跳转点,并传递一个特定的值作为异常处理的结果。

异常处理函数的使用方法如下:1. 使用setjmp函数设置一个跳转点,将跳转点保存在一个jmp_buf类型的变量中。

2. 在程序执行过程中,如果发生异常情况,调用longjmp函数跳转到之前设置的跳转点,并传递一个特定的值作为异常处理的结果。

3. 在异常处理函数中,根据传递的异常处理结果进行相应的处理,例如输出错误信息、关闭文件等。

异常处理函数的优点是可以在程序的任何地方进行异常处理,并且可以跳过一些中间步骤,直接跳转到异常处理的代码段。

这样可以提高程序的执行效率,并且使程序的结构更加清晰。

三、异常处理的应用异常处理在实际的程序开发中有着广泛的应用。

它可以用于处理各种类型的异常情况,例如文件打开失败、内存分配失败、网络连接中断等。

通过合理地使用异常处理机制,可以使程序在出现异常情况时能够进行适当的处理,从而提高程序的稳定性和可靠性。

C语言的异常机制setjumplongjump函数2

C语言的异常机制setjumplongjump函数2

C语言的异常机制 setjump longjump函数C语言中一种更优雅的异常处理机制实际上goto语句是面向过程与面向结构化程序语言中,进行异常处理编程的最原始的支持形式。

后来为了更好地、更方便地支持异常处理编程机制,使得程序员在C语言开发的程序中,能写出更高效、更友善的带有异常处理机制的代码模块来。

于是,C语言中出现了一种更优雅的异常处理机制,那就是 setjmp()函数与longjmp()函数。

实际上,这种异常处理的机制不是C语言中自身的一部分,而是在C标准库中实现的两个非常有技巧的库函数,也许大多数C程序员朋友们对它都很熟悉,而且,通过使用setjmp()函数与longjmp()函数组合后,而提供的对程序的异常处理机制,以被广泛运用到许多C语言开发的库系统中,如jpg解析库,加密解密库等等。

也许C语言中的这种异常处理机制,较goto语句相比较,它才是真正意义上的、概念上比较彻底的,一种异常处理机制。

作风一向比较严谨、喜欢刨根问底的主人公阿愚当然不会放弃对这种异常处理机制进行全面而深入的研究。

下面一起来看看。

setjmp函数有何作用? 前面刚说了,setjmp是C标准库中提供的一个函数,它的作用是保存程序当前运行的一些状态。

它的函数原型如下:int setjmp( jmp_buf env ); 这是MSDN中对它的评论,如下: setjmp函数用于保存程序的运行时的堆栈环境,接下来的其它地方,你可以通过调用longjmp函数来恢复先前被保存的程序堆栈环境。

当 setjmp和longjmp 组合一起使用时,它们能提供一种在程序中实现“非本地局部跳转”("non-local goto")的机制。

并且这种机制常常被用于来实现,把程序的控制流传递到错误处理模块之中;或者程序中不采用正常的返回(return)语句,或函数的正常调用等方法,而使程序能被恢复到先前的一个调用例程(也即函数)中。

C语言的错误处理和异常处理技巧

C语言的错误处理和异常处理技巧

C语言的错误处理和异常处理技巧在软件开发过程中,错误处理和异常处理是非常重要的一环。

无论是在C语言还是其他编程语言中,处理错误和异常都是保证程序稳定性和可靠性的关键。

本文将探讨C语言中的错误处理和异常处理技巧,帮助读者更好地理解和应用这些技术。

一、错误处理的基本原则在C语言中,错误处理的基本原则是“及早发现、及早处理”。

这意味着在程序中尽早地检测错误,并采取相应的处理措施,以避免错误的进一步扩大或引发其他问题。

下面是一些常见的错误处理技巧:1. 返回值检查:在调用函数或方法之后,应该检查其返回值,判断是否出现错误。

例如,当使用malloc函数分配内存时,应该检查返回的指针是否为NULL,以确保内存分配成功。

2. 错误码传递:有时候,函数的返回值并不能完全表达错误的详细信息。

这时,可以使用错误码来传递更多的错误信息。

例如,可以定义一组错误码,每个错误码对应一种错误类型,以便更好地识别和处理错误。

3. 异常标志:有些错误可能无法通过返回值或错误码来传递,这时可以使用异常标志来表示错误的发生。

异常标志可以是一个全局变量或者一个局部变量,通过设置其值来表示错误的发生,并在适当的时候进行处理。

二、异常处理的技巧除了错误处理,C语言中还可以使用异常处理来处理一些特殊情况。

异常处理是一种用于处理程序运行过程中出现的异常情况的技术,它可以帮助我们优雅地处理程序中的错误,并保证程序的正常执行。

1. 异常捕获:在C语言中,异常处理通常通过使用setjmp和longjmp函数来实现。

setjmp函数用于设置一个跳转点,而longjmp函数则用于跳转到该跳转点,并传递一个异常值。

通过结合使用这两个函数,我们可以在程序的任何地方捕获异常,并进行相应的处理。

2. 异常传递:有时候,我们需要在不同的函数之间传递异常。

这时,可以使用全局变量或者函数参数来传递异常值。

通过在函数调用链中传递异常值,我们可以将异常从一个函数传递到另一个函数,并在适当的时候进行处理。

C语言的异常机制 SETJUMP LONGJUMP函数

C语言的异常机制 SETJUMP LONGJUMP函数
1.输入小于等于 0 的值
Input N:0 Error Test,ErrNum:1! 2.输入大于 0 的值 Input N:1 N is:1 Out of run,ErrNum:4!
注意:上面的.h 文件是 C 中 TRY...CATCH 的实现,main 函数是 TRY...CATCY 的一 个例子
usr_root : c99 支持异常吗? 周星星 : 当然不 usr_root : 为什么是当然不?异常机制和 c 无缘? 七猫 : 当然,到现在还有很多人不喜欢异常。连有些 C++的标准库都支持不带 异常的。 周星星 : :)俺就是这样的人 usr_root : 哦,我是你的影子
汗!?为了 C 语言偶不得不说几句申一下冤,真是比窦娥还冤:C 语言中,标准库 函数 setjmp 和 longjmp 形成了结构化异常工具的基础。简单的说即 setjmp 实例化 异常处理程序,而 longjmp 产生异常。举个例子如下:
int setjmp( jmp_buf env );
这是 MSDN 中对它的评论,如下:
setjmp 函数用于保存程序的运行时的堆栈环境,接下来的其它地方,你可以 通过调用 longjmp 函数来恢复先前被保存的程序堆栈环境。当 setjmp 和 longjmp 组合一起使用时,它们能提供一种在程序中实现“非本地局部跳转”("non-local
C 语言的异常机制 setjump longjump 函数
用 C 语言有一段时间, 但是对于 setjump 和 longjump 还真的一无所知,汗, 转几篇帖子供学习参考,
转自: C 语言的异常机制 setjump longjump 函数 C 语言的异常机制 晚上回家翻 vckbase 的帖子,看到这么一段:

C语言错误处理

C语言错误处理

C语言错误处理错误处理在任何程序设计语言中都是一个重要的部分,它可以帮助我们识别和纠正代码中的问题,并提供合适的反馈给用户。

在C语言中,错误处理机制是由程序员自己编写的,因此我们需要遵循一些最佳实践来确保代码的可读性和可维护性。

本文将讨论C语言中的错误处理机制及其相关的常用方法。

错误处理的概念在程序执行过程中,可能会出现各种各样的错误,例如输入错误、内存分配错误、文件操作错误等等。

为了正确处理这些错误,我们需要在代码中实现相应的机制。

C语言并没有像其他高级语言那样提供内置的异常处理机制,因此我们需要使用其他方式来处理错误。

错误处理的方法在C语言中,常用的错误处理方法有以下几种:1. 错误返回值错误返回值是一种简单而常用的方法,它通过返回一个特定的值来表示函数执行的结果。

通常情况下,一个函数的返回值为0表示执行成功,而其他非零值则表示执行失败,并且返回的值通常用于进一步识别错误的原因。

例如,标准库函数fopen()在打开文件失败时会返回NULL指针。

2. 全局错误变量全局错误变量是另一种常见的错误处理方法,它类似于错误返回值,但是将错误信息保存在全局变量中。

在发生错误时,函数可以将错误信息存储在全局变量中,供其他函数进行查看和处理。

3. 异常处理库虽然C语言本身没有内置的异常处理机制,但是我们可以使用第三方库来实现异常处理功能。

这些库通常提供了一些宏和函数,用于捕获和处理异常。

例如,C语言标准库提供了<setjmp.h>和<signal.h>头文件,它们允许我们使用setjmp()和longjmp()函数来实现类似异常处理的机制。

4. 日志记录日志记录是一种常用的错误处理方法,它将错误信息记录在一个日志文件中,供程序员分析和调试。

通过使用日志记录,我们可以追踪程序执行过程中的错误,并对其进行适当的处理。

错误处理的最佳实践除了上述常用的错误处理方法之外,以下是一些C语言错误处理的最佳实践:1. 明确返回错误码当一个函数执行失败时,应该明确指示失败的原因,并通过返回一个错误码来告知调用者。

C语言异常处理机制—为您的C程序添加异常处理

C语言异常处理机制—为您的C程序添加异常处理

C语言异常处理机制—为您的C程序添加异常处理C语言是一种面向过程的编程语言,没有内置的异常处理机制。

然而,在编写C程序时,我们可以采用一些技巧来实现异常处理的功能,以应对程序在运行过程中可能出现的错误。

异常处理机制能够提高程序的稳定性和可靠性,使程序在出现错误时能够进行优雅的处理,而不是直接崩溃退出。

下面介绍几种常见的异常处理方法。

1.错误码返回值:这是C语言最常用的异常处理方法之一、在函数调用时,将出现的错误用一个特定的返回值表示,并根据返回值进行相应的处理。

通常约定返回值为0代表正常执行,其他返回值代表错误。

可以使用枚举类型来定义具体的错误码,以增加可读性。

2.全局变量保存错误信息:在程序的全局范围内定义一个变量,用来保存错误信息,当发生错误时将错误信息保存到该变量中。

在函数调用时,可以通过检查错误信息来判断是否发生错误,并进行相应的处理。

需要注意的是,在多线程环境下,需要使用互斥锁来保证对错误信息的访问是线程安全的。

3. setjmp(和longjmp(函数:setjmp(函数用于设置一个跳转点,并返回0,然后程序可以在任意位置调用longjmp(函数,将控制权返回到该跳转点,并返回setjmp(函数的第二个参数值。

该方法适用于一些特殊的情况,如资源回收等。

4.信号处理:C语言通过signal(函数来注册信号处理函数,当程序接收到相应的信号时,会调用注册好的处理函数来对该信号进行处理。

可以根据不同的信号来定义相应的处理策略,如忽略、终止程序或执行自定义的处理函数。

5.异常处理库:在C语言中,也有一些第三方的异常处理库可以使用,例如GNUC库提供的异常处理机制。

这些库通常提供了更为强大和灵活的异常处理功能,能够捕获异常、处理异常并提供异常的详细信息。

总的来说,虽然C语言没有内置的异常处理机制,但我们可以通过一些技巧来模拟实现异常处理的功能,提高程序的稳定性和可靠性。

在编写C程序时,我们应该预先考虑可能的异常情况,并为程序添加相应的异常处理机制,以便在出现错误时进行合理的处理。

C异常处理避免程序崩溃的技巧

C异常处理避免程序崩溃的技巧

C异常处理避免程序崩溃的技巧异常处理是编程中不可忽视的重要部分。

在C语言中,异常的意思是指程序运行过程中可能会遇到的错误或异常情况。

当这些异常情况发生时,如果没有正确处理,就会导致程序崩溃或运行不正常。

因此,合理而有效的异常处理是确保程序稳定性和可靠性的关键。

本文将介绍一些C异常处理的技巧,帮助避免程序崩溃。

一、使用try-catch语句处理异常C语言并没有像其他高级语言那样提供try-catch语句来处理异常,但我们可以使用一些方法来实现类似的效果。

一个常见的技巧是使用setjmp和longjmp函数。

setjmp函数用于设置一个“跳转点”,而longjmp函数用于从异常处理的位置跳回到设置的“跳转点”。

下面是一个使用setjmp和longjmp函数处理异常的示例代码:```c#include <stdio.h>#include <setjmp.h>jmp_buf jmp_buffer;void handle_exception(){printf("Exception occurred!\n");longjmp(jmp_buffer, 1);}void function1(){if (setjmp(jmp_buffer) == 0) {// 正常运行代码}else{// 处理异常handle_exception();}}int main(){function1();return 0;}```在上面的代码中,如果异常发生,会触发handle_exception函数,并输出"Exception occurred!"。

通过使用setjmp和longjmp函数,我们可以在C语言中模拟出类似try-catch的异常处理机制,提高程序的容错性。

二、合理利用返回值和错误码除了使用类似try-catch的异常处理机制外,C语言中还可以通过返回值和错误码来处理异常情况。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用setjmp()/longjmp()实现多线程
1. 函数定义
int setjmp(jmp_buf mybuf);
void longjmp(jmp_buf mybuf, int state);
2. jmp_buf的内容
* 32 bytes
* program conter --current program address
* stack pointer -- current stack pointer address
* suiside entry address, suiside frame pointer
* parameters
3. 汇编内容(尚未找到)
4. 基本实现方法
int main()
{
char * mysp;
/* get stack spaces for every thread */
unsigned long static_stack[N_THREADS+2][N_PAGES_PER_THREAD * PAGESIZE];
main.init();
mysp = (char *)static_stack;
dispatcher.init(mysp);
for( each thread)
{
mysp += N_PAGES_PER_THREAD * PAGESIZE;
thread.init(mysp);
}
longjmp(dispatch_buf,1);
}
main.init()
{
generate PCB list;
}
dispatcher.init() /* same as thread.init() */
{
set myjmp_buf;
}
5. 说明
* 用setjmp()和longjmp()实现多线程,需要注意保护栈空间。

因此,我们使用静态事情栈空间,然后通过改变每个线程对应的jmp_buf中的SP值来保证各个线程之间不会相互毁坏数据。

有时为了提高系统的鲁棒性,我们会用mprotect()来保证memory不会被别的线程改写。

* 我们自己实现了一个dispacther来实现各个多线程优先级处理,详情参加操作系统部分
* 本程序中,使用的静态线程原则,其线程数有限且固定,同一线程号会被重用,因此若某一进程结束,其PCB必须要被清理。

* 本程序所占有的memory在程序运行过程中也是固定的
* 每个线程中可以选择在等待消息或者事件的时候用longjmp(dispatch_buf,1)让出cpu
* 也可以注册OS time service,获取定期中断,从而在一定程度上模拟真实kernal。

相关文档
最新文档