在 C 上编写类似 shell 的程序时,我遇到了信号处理方面的问题。
这是我的代码的简化版本:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#define SIZE 255
void sig_handler(int sig){
if (sig == SIGINT)
printf("\n[shell]$\n");
}
int main()
{
char input[SIZE];
printf("[shell]$");
signal(SIGINT,sig_handler);
while( gets(input) != NULL ){
// code of the shell including command interpreter and command execution
printf("[shell]$");
}
return 0;
}
当我运行程序并使用命令“cat”尝试 SIGINT 时,输出显示如下:
[shell]$ ^C (ctrl+C pressed for the first time)
[shell]$
^C (the input position go to the next line, which is unwanted)
[shell]$
cat (I want it in the same line with [shell]$)
^C
[shell]$
[shell]$ (duplicate printing occurs)
我试图通过删除第二个 \n 来修改函数 void sig_handler(int sig)。然而,情况变得比以前更糟了。程序不会在第一次按下 ctrl+C 时自动触发信号事件。
为了澄清我的问题,这是我提出的两个问题:
1. 如何使输入位置与 [shell]$ 位于同一行?
2. 如何解决重复打印问题?