<div dir="ltr">Thank you Joel for all of the hints.<div>I find the maximum number - 64 - of file descriptors somehow low when compared with Linux and RTEMS 4  </div><div>(RTEMS 4 did not have the restriction with FD_SETSIZE).</div><div><br></div><div>Anyhow, my application is EPICS base and most of the open file descriptors refer to the clients which connect using sockets.</div><div>I will place the EPICS channel access gateway "in front" of my RTEMS epics server to narrow down the number of clients to just one.</div><div>This is just a work around but should satisfy the problem.</div><div><br></div><div>Best Regards</div><div>Mirek</div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">pon., 17 paź 2022 o 16:20 Chris Johns <<a href="mailto:chrisj@rtems.org">chrisj@rtems.org</a>> napisał(a):<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 18/10/2022 9:19 am, Miroslaw Dach wrote:<br>
>>AFAIK you'd have to patch the header in the C Library when building the tools<br>
> using the RSB to have a possible clean solution. Editing the installed header<br>
> would be uncool.<br>
> I see , I thought that it is somehow simpler thing.<br>
>>How many descriptors do you need? And will you be using select()?<br>
> I need maximum 128 file descriptors to be used.<br>
<br>
The issue is a little more complicated because of the way the fd number are<br>
allocated. RTEMS implements not reusing fd number once free (closed) preferring<br>
to move to an unused fd number until all numbers have been used. The idea is to<br>
try and catch the accidental continued use of an fd after close when an open<br>
follows.<br>
<br>
If you allocate 200 descriptors the following select code will work:<br>
<br>
/* RTEMS entry point */<br>
void Init(void) {<br>
  /* start networking */<br>
  int fd = socket(...);<br>
  FD_ZERO(&set);<br>
  FD_SET(fd, &set);<br>
  nfds = sd + 1;<br>
  r = select(nfds, &set, NULL, NULL, NULL);<br>
  /* blah blah */<br>
}<br>
<br>
while this will not:<br>
<br>
/* RTEMS entry point */<br>
void Init(void) {<br>
  /* use up all the fd spots select has by default */<br>
  for (i = 0; i < 65; i++) {<br>
    fd = open("afile", ...);<br>
    close(fd);<br>
  }<br>
  /* start networking */<br>
  fd = socket(...);<br>
  FD_ZERO(&set);<br>
  /* out of range access */<br>
  FD_SET(fd, &set);<br>
  nfds = sd + 1;<br>
  rv = select(nfds, &set, NULL, NULL, NULL);<br>
  /* blah blah */<br>
}<br>
<br>
If you control the code in quesiton and can make changes the following are some<br>
suggestions:<br>
<br>
1. Consider a thread per descriptor. Select is slow<br>
<br>
2. Look at kqueue, it is a better interface for this type of blocking<br>
<br>
3. Look at the following select work around ..<br>
<a href="https://git.rtems.org/rtems/tree/cpukit/mghttpd/mongoose.c#n1522" rel="noreferrer" target="_blank">https://git.rtems.org/rtems/tree/cpukit/mghttpd/mongoose.c#n1522</a><br>
<br>
Chris<br>
</blockquote></div>