我正在为一个操作系统项目编写一个程序,它基本上是一个调制解调器键盘,因为我键入一个键,它输出一个与该键的 ASCII 值相对应的 FSK 调制音频信号。我如何设置我的程序是它派生一个进程并执行一个名为 minimodem 的程序(有关信息,请参见此处)。父级设置为非规范输入模式,并让用户一次输入一个字符。然后通过管道将每个字符发送给孩子。我现在就粘贴代码:
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <string.h>
#include <termios.h>
extern char* program_invocation_short_name;
static struct termios old, new;
void init_termios(int echo);
void reset_termios(void);
int main(int argc, char* argv[])
{
pid_t pid;
int my_pipe[2];
char* baud = "300";
if (argc == 2) {
if(atoi(argv[1]) == 0) {
printf("Use: %s [baud]\n",program_invocation_short_name);
return EXIT_SUCCESS;
}
baud = argv[1];
}
if (argc > 2) {
printf("Too many arguments.\nUsage: %s [baud]\n",program_invocation_short_name);
return EXIT_SUCCESS;
}
if (pipe(my_pipe) == -1) {
fprintf(stderr, "%s: %s",program_invocation_short_name,strerror(errno));
return EXIT_FAILURE;
}
pid = fork();
if (pid < (pid_t) 0) {
fprintf(stderr, "%s: %s",program_invocation_short_name,strerror(errno));
return EXIT_FAILURE;
}else if (pid == (pid_t) 0) {
/***************/
/*CHILD PROCESS*/
/***************/
close(my_pipe[1]); /*Child doesn't write*/
dup2(my_pipe[0], 0); /*Redirect stdin to read side of pipe*/
close(my_pipe[0]); /*Close read end as it's dup'd*/
execl("/usr/local/bin/minimodem","minimodem","--tx", baud,"-q","-A",NULL);
fprintf(stderr, "%s: %s",program_invocation_short_name,strerror(errno));
}else if (pid > (pid_t) 0) {
/****************/
/*PARENT PROCESS*/
/****************/
char c;
close(my_pipe[0]); /*Parent doesn't read*/
init_termios(1);
atexit(reset_termios);
while(1) {
c = getchar();
if (c == 0x03)
break;
if (write(my_pipe[1], &c, 1) == -1) {
fprintf(stderr, "%s: %s",
program_invocation_short_name, strerror(errno));
return EXIT_FAILURE;
}
}
close(my_pipe[1]);
}
return EXIT_SUCCESS;
}
void init_termios(int echo)
{
tcgetattr(0, &old); /*get old terminal i/o settings*/
new = old; /*make new settings same as old settings */
new.c_lflag &= ~ICANON;
new.c_lflag &= echo ? ECHO : ~ECHO; /*set appropriate echo mode*/
tcsetattr(0, TCSANOW, &new); /*use new terminal i/o settings*/
}
void reset_termios(void)
{
tcsetattr(0, TCSANOW, &old);
}
我的问题是用户输入。打字时,似乎第一个字符被写入并生成了音频,然后有一个延迟,然后缓冲区中的其余字符会像预期的那样连续生成。如果输入中有足够大的停顿,那么它会回到开始,在中断后输入的第一个字符生成,然后是延迟,然后是预期的功能。我的手指交叉,这不是因为 minimodem 程序不是为了以这种方式使用而编写的,而且这个问题是可以克服的。如果有人能对此事有所了解,我将非常感激。谢谢。
注意:我尝试将输入放入一个环形缓冲区,然后将该输入消耗并在单独的线程中发送给孩子。NOOOT 更好。甚至不确定注意到这是否有效。