我的信号处理函数不是没有以正确的方式离开吗?它似乎不能正常返回程序。相反,它进入了循环,在那里它应该等待用户输入时,跳过并将"用户输入"的长度读取为-1,并出现错误。(在代码中更容易理解)
void handle_SIGINT() {
int k = recent;
int count = 0;
int stop;
if (stringSize >= 10) {
stop = 10;
}
else {
stop = p;
}
printf("\nCommand History:\n");
for (count = 0; count < stop; count++) {
if (k < 0) {
k += 10;
}
printf("%s", string[abs(k)]);
k -= 1;
}
}
void setup(char inputBuffer[], char *args[],int *background)
{
//char inputBuffer[MAX_LINE];
int length, /* # of characters in the command line */
i, /* loop index for accessing inputBuffer array */
start, /* index where beginning of next command parameter is */
ct; /* index of where to place the next parameter into args[] */
int add = 1;
ct = 0;
/* read what the user enters on the command line */
length = read(STDIN_FILENO, inputBuffer, MAX_LINE);
printf("%i",length);
start = -1;
if (length == 0)
exit(0); /* ^d was entered, end of user command stream */
if (length < 0){
perror("error reading the commanddddddddd");
exit(-1); /* terminate with error code of -1 */
}
}
int main(void)
{
char inputBuffer[MAX_LINE]; /* buffer to hold the command entered */
int background; /* equals 1 if a command is followed by '&' */
char *args[MAX_LINE/2+1];/* command line (of 80) has max of 40 arguments */
FILE *inFile = fopen("pateljay.history", "r");
if (inFile != NULL) {
int count = 0;
char line[MAX_LINE];
while (fgets(line,sizeof line, inFile) != NULL) {
string[count] = strdup(line);
//string[count][strlen(line)] = '\n';
//string[count][strlen(line) + 1] = '\0';
printf("%s", string[count]);
count++;
stringSize++;
}
p = count % 10;
recent = abs(p - 1);
}
fclose(inFile);
/* set up the signal handler */
struct sigaction handler;
handler.sa_handler = handle_SIGINT;
sigaction(SIGINT, &handler, NULL);
while (1) {/* Program terminates normally inside setup */
background = 0;
printf("COMMAND->");
fflush(0);
setup(inputBuffer, args, &background);/* get next command */
}
}
当输入ctrl+c时,应该捕获信号并处理它。一旦返回到主函数,它将进入设置并完全跳过读取函数,并将长度设为-1。这反过来会导致程序出错。我认为handle_SIGINT内部的代码现在是无关紧要的。有人知道为什么它会跳过设置中的读取函数吗?
printf
问题,当在信号处理程序中使用时,请参考此问题和答案:https://dev59.com/6EzSa4cB1Zd3GeqPoJ50#2461602 - Macmadeprintf
从信号处理程序中移除是一个相当棘手的问题。请参考 http://osiris.978.org/~alex/safesignalhandling.html 获取一些解决方案。 - rob mayoff