当我学习K& R C编程语言时,我正在尝试编写一个从控制台读取一些行然后输出所有输入的程序。我需要使用ctrl-z(EOF)来终止我的输入流。但问题是当我点击ctrl-z时,程序停止,所有输入都无法输出到控制台(gdb说“程序接收信号SIGTSTP,停止(用户).0X00132416 in __kernel_vsyscall()”)。我试图使用kill函数来处理这个终止信号但是失败了。我该怎么做才能让控制台输出所有输入线。我的部分代码如下:
#include<stdio.h>
#include<string.h>
#define MAXLINES 5000 /* possibly max amount of lines */
char *lineptr[MAXLINES]; /* pointers to lines read */
int readlines(char *lineptr[], int nlines);
void writelines(char *lineptr[], int nlines);
main(int argc, char *argv[])
{
int nlines; /* number of lines read */
**if ((nlines = readlines(lineptr, MAXLINES)) >= 0)** {//program finished when I tap ctrl-z
writelines(lineptr, nlines); // from this line can't be run
return 0;
} else {
printf("input too big to sort\n");
return 1;
}
}
#define MAXLEN 1000
int get_line(char *, int);
char *alloc(int);
/* readlines : read the input */
int readlines(char *lineptr[], int maxlines)
{
int len, nlines;
char *p, line[MAXLEN];
nlines = 0;
while ((len = get_line(line, MAXLEN)) > 0)
if (nlines >= maxlines || (p = alloc(len)) == NULL)
return -1;
else {
line[len - 1] = '\0';
strcpy(p, line);
lineptr[nlines++] = p;
}
return nlines;
}
/* writelines : output the readlines */
void writelines(char *lineptr[], int nlines)
{
int i;
for (i = 0; i < nlines; i++)
printf("%s\n", lineptr[i]);
}
答案 0 :(得分:2)
如果您正在使用linux / unix平台,ctrl-z暂停程序,程序接收SIGSTOP而不是EOF。 EOF通常是ctrl-D。运行stty -a命令设置/更改终端线路设置。如果必须使用ctrl-z更改stty设置。
希望这有帮助。
答案 1 :(得分:1)
Ctrl + Z 在大多数Linux终端上发送暂停信号。在Linux上,EOF通常是 Ctrl + D 。
Ctrl + Z 在Windows上是EOF。
答案 2 :(得分:0)
因为在Linux上,Ctrl + D是EOF标记而不是Ctrl + Z,它会将SIGSTP发送到进程。
因此,当您真正想要的是输入EOF字符时,每次按Ctrl + Z时基本上都要求您的进程停止。