【问题标题】:Error if getc reads more than 4096 chars如果 getc 读取超过 4096 个字符,则会出错
【发布时间】:2017-09-19 13:15:21
【问题描述】:

我的程序有问题。我在无限循环中从标准输入读取它工作正常但是当我将超过 4096 个字符放入标准输入时它开始表现不佳我不知道为什么。 getc 有限制吗?我会把你放在这里输入和输出的插图

 #define NFDS 1
 #define h_addr h_addr_list[0]
 #define BUFFER_LEN 4096
 void *sending(void *arguments)
 {
struct arg_struct *args = arguments;
            int i = 0, j = 1;
            if(signal(SIGINT, receive_signal) == SIG_ERR) {
                        fprintf(stderr, "Error setting signal handler for SIGINT.\n");
                    }
            fd_set myset;
            struct timeval tim;
            int result;
            int data_cap = 4096;
            while(running)
            {
                tim.tv_sec = 0;
                tim.tv_usec = 500;
                FD_ZERO(&myset);
                FD_SET(STDIN_FILENO, &myset);
                result = select(STDIN_FILENO + 1, &myset, NULL, NULL, &tim);
                if(result != 0)
                {
                        str = calloc(data_cap,sizeof(char));
                        while((c = getc(stdin)) != '\n')
                        {
                            if (j >= data_cap)
                            {
                                str = realloc(str,sizeof(char) * data_cap * 2);
                                data_cap = data_cap * 2;
                            }
                            str[i] = c;
                            i++;
                            j++;
                        }
                        if (j >= data_cap)
                        {
                            str = realloc(str,sizeof(char) * data_cap * 2);
                        }
                        str[i] = '\0';
                        if(strlen(str)!=0)
                        {
                            bufferIn = message(args->arg2,str);
                                 if(send(args->arg1,bufferIn,strlen(bufferIn),0) < 0)
                            {
                                callError("ERROR: cannot send socked");
                            }
                            free(bufferIn);
                        }
                        free(str); i = 0; j = 1; data_cap = 4096;           
                }
            }
return NULL;
 }

//in main threads
  struct arg_struct args;
    args.arg1 = client_socket;
    args.arg2 = username;
 pthread_t t22;
 pthread_t t11;
 pthread_create(&t22, NULL, &sends, (void *)&args);
 pthread_create(&t11, NULL, &reci, (void *)&args);
 pthread_join(t22, NULL);
  pthread_cancel(t22);
 pthread_join(t11, NULL);
 pthread_cancel(t11);

输入例如:aaaaaaaa.....aaaaaaaaa THIS IS THE WORD

假设从第一个 'a' 到最后一个 'a' 的序列中有 4096 个 'a' 字符 但是当我打印我从标准输入得到的东西时,我得到了这个:

这就是这个词 aaaaaaa......aaaaaaa 这是这个词

它真正做的是一开始,它从 4096.char 中读取所有字符。在这个例子中,它是“THIS IS THE WORD”并首先打印出来。比它真正打印它应该首先打印的内容。

所有字符之间没有行尾符号 起初我认为内存分配有问题,因为我将内存分配为 4096 字节,但没有。我测试了它。 谢谢你的帮助 抱歉英语不好

【问题讨论】:

  • 你的空格键有问题吗?压痕无处不在
  • 上面定义了一个名为BUFFER_LEN的宏,其值为4096。用于定义大小为4096的char数组。你会溢出吗?
  • 能否只显示代码的相关部分?当真正的问题在一个小得多的代码块中时,很难阅读这么多的代码。
  • 不,getc 不受限制。
  • 代码编辑完成,没有 BUFFER LEN 没有在那个有问题的函数中使用

标签: c multithreading stdin


【解决方案1】:

这更像是一个评论而不是一个答案,但由于它很长,我将它按原样发布在这里。

肯定有其他问题,因为将“有问题”的部分隔离为:

  char c;
  int i=0, j=1, data_cap=4096;
  char *str = calloc(data_cap,sizeof(char));
  while((c = getc(stdin)) != '\n') {
    if (j >= data_cap) {
      str = realloc(str,sizeof(char) * data_cap * 2);
      data_cap = data_cap * 2;
    }
    str[i] = c;
    i++;
    j++;
  }
  if (j >= data_cap) {
    str = realloc(str,sizeof(char) * data_cap * 2);
  }
  str[i] = '\0';
  if(strlen(str)!=0) {
    char *bufferIn = message("test",str);
    printf("%s\n",bufferIn);
    free(bufferIn);
  }
  free(str); i = 0; j = 1; data_cap = 4096;           

效果很好。

由于您没有告诉我们函数的参数是什么,我们无法提供更多信息......

【讨论】:

  • 我在这个程序中使用异步。并行线程的信号处理我认为这可能是一些问题。因为您没有使用选择函数或信号处理程序,可能存在问题,但您是否真的尝试输入长度大于 4096 的输入?
  • 那你知道你的问题是......你的receive_signal是做什么的?线程是否在并发读取输入?
  • 不,他们不是一个线程正在检查标准输入并向服务器发送消息,第二个线程正在等待服务器发送消息并写入 stdou 并接收信号检查是否发送 SIGINT 以中断循环并结束整个程序
  • 是的,我用(非常)长的输入对其进行了测试,并且效果很好。请发布 MVCE。
  • 我发现这里可能有问题unix.stackexchange.com/questions/131105/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 2015-09-25
  • 2020-05-31
  • 2014-01-12
  • 1970-01-01
  • 2011-05-15
相关资源
最近更新 更多