📄 tlongjmp.c
字号:
/* 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -