在虚拟shell中处理CTRL-C
我正在编写一个虚拟shell,当用户输入ctrl-C时它不应该终止,但是应该只生成一个新的提示行。 目前,当我输入ctrl-C时,我的shell不会终止,但它仍然不会打印新的提示行。 你知道为什么会这样,我怎么解决这个问题?
我的代码如下:
#include #include #include #include #include #include #include #define BUFFER_SIZE 1<<16 #define ARRAY_SIZE 1<= &bufCmdArgs[cmdArgsSize])) break; } for (p=n=0; bufCmdArgs[n]!=NULL; n++){ if(strlen(bufCmdArgs[n])>0) cmdArgs[p++]=bufCmdArgs[n]; } *nargs=p; cmdArgs[p]=NULL; } void INThandler(int sig) { printf("\n> "); signal(sig, SIG_IGN); } int main(void) { char buffer[BUFFER_SIZE]; char *args[ARRAY_SIZE]; int retStatus; size_t nargs; pid_t pid; printf("$dummyshell\n"); signal(SIGINT, INThandler); while(1){ printf("> "); fgets(buffer, BUFFER_SIZE, stdin); parseCmdArgs(buffer, args, ARRAY_SIZE, &nargs); if (nargs==0) continue; if (!strcmp(args[0], "help")) { printf("cat cd (absolute path references only\n"); printf("exit\n"); printf("help history\n"); printf("jobs kill\n"); printf("ls more\n"); printf("ps pwd\n"); continue; } if (!strcmp(args[0], "exit" )) exit(0); pid = fork(); if (pid){ wait(&retStatus); } else { if( execvp(args[0], args)) { fprintf(stderr, "%s\n", strerror(errno)); exit(127); } } /* pid = fork(); if (pid == 0) setpgrp(); else if (pid) pid = wait(&retStatus); else { if (execvp(args[0], args)){ fprintf(stderr, "%s\n", strerror(errno)); exit(127); } }*/ } return 0; }
但是我会通过fflush()传递什么?
这将是
fflush(stdout);
– 但由于fgets(buffer, BUFFER_SIZE, stdin)
。
默认情况下,引用终端设备的输出流始终是行缓冲的; 每当读取引用终端设备的输入流时,就会自动写入对这些流的待处理输出。
(见man stdio
。)
我假设您希望中断处理程序跳转到main
函数中的while循环,而不是打印"\>"
。
你可以使用sigsetjmp
和siglongjmp
。 你可能想以[1]为例。
#include #include #include jmp_buf JumpBuffer; void INThandler(int); void main(void) { signal(SIGINT, INThandler); while (1) { if (setjmp(JumpBuffer) == 0) { printf(">"); /*...*/ } } } void INThandler(int sig) { signal(sig, SIG_IGN); signal(SIGINT, INThandler); longjmp(JumpBuffer, 1); }
这改编自[2]。 如果使用sigaction()
, sigprocmask()
或sigsuspend()
,则需要分别使用siglongjmp
和sigsetjmp
函数[3]。
资料来源 :
- [1] https://publib.boulder.ibm.com/iseries/v5r2/ic2924/index.htm?info/apis/siglngj.htm
- [2] http://www.csl.mtu.edu/cs4411.ck/www/NOTES/non-local-goto/sig-1.html
- [3] sigsetjmp – Open Group Base Specifications Issue 6 IEEE Std 1003.1,2004 Edition