在虚拟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循环,而不是打印"\>"

你可以使用sigsetjmpsiglongjmp 。 你可能想以[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() ,则需要分别使用siglongjmpsigsetjmp函数[3]。

资料来源