tlongjmp.c
来自「su 的源代码库」· C语言 代码 · 共 66 行
C
66 行
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved. */#include "stdtest.h"#include <setjmp.h>#include <signal.h>/* this tests that stdio streams will not be locked even with longjmp */jmp_buf Env;int Fd[2];char Str[] = "Signal handler\n";#if __STD_Cvoid sighandler(int sig)#elsevoid sighandler(sig)int sig;#endif{ if(write(Fd[1], Str, strlen(Str)) != strlen(Str)) terror("Writing to pipe failed"); longjmp(Env,0);}MAIN(){ FILE* f; char* s; char buf[128]; if(pipe(Fd) < 0) terror("Can't create pipe"); if(!(f = fdopen(Fd[0],"r"))) terror("Can't open read stream"); if(setjmp(Env) == 0) { /* set alarm handler */ tmesg("\tIf hung, send interrupt or quit signal\n"); signal(SIGALRM,sighandler); signal(SIGHUP,sighandler); signal(SIGQUIT,sighandler); alarm(2); /* we expect this to block on read */ fgets(buf,sizeof(buf),f); terror("fgets did not block!"); } else /* got back from longjmp() */ { #if _SFIO_H if((f->mode&SF_RDWR) == f->mode) terror("Stream should be locked");#endif clearerr(f); /* make sure that stream is ok for IO */ /* this fgets should succeed */ if(!(s = fgets(buf,sizeof(buf),f)) ) terror("fgets returned NULL"); if(strcmp(s,Str) != 0) terror("fgets returned wrong data\n"); } TSTEXIT(0);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?