| ===================== |
| Multiple NSH Sessions |
| ===================== |
| |
| .. warning:: |
| Migrated from: |
| https://cwiki.apache.org/confluence/display/NUTTX/Multiple+NSH+Sessions |
| |
| Q: |
| I would like to run the NuttShell on multiple serial ports, but haven't |
| figured it out yet; can you point me in the right direction? |
| |
| A: |
| Easy. Don't use ``apps/examples/nsh_main.c``. Create your own main function |
| something like this (with all error handling omitted for simplicity). By the |
| way, this is all standard POSIX stuff that you can get detailed information |
| about by just Googling `dup2` or maybe `I/O redirection`: |
| |
| .. code-block:: c |
| |
| int my_main(int argc, char **argv) |
| { |
| const char *tty = argv[1]; |
| int fd = open(tty, O_RDWR); |
| (void)dup2(fd, 0); |
| (void)dup2(fd, 1); |
| (void)dup2(fd, 2); |
| close(fd); |
| ... |
| } |
| |
| And the rest is just like the original ``nsh_main()`` function (in fact, |
| perhaps the existing ``nsh_main()`` function could be optionally extended to |
| accept a console device string?). Then you can start a new NSH session on any |
| TTY like: |
| |
| .. code-block:: none |
| |
| nsh> mynsh /dev/ttyS2 & |
| |
| This should cause a new NSH session to appear on ``ttyS2``. That session will |
| persist until you do the following from the new session: |
| |
| .. code-block:: none |
| |
| nsh> exit |
| |
| Then the new session, i.e., ``my_main()`` will exit. |
| |
| If you were to do something like: |
| |
| .. code-block:: none |
| |
| nsh> mynsh /dev/console |
| |
| then you would get nested NSH sessions on the same console. The first session |
| would halt and wait for the second session to take control of the console until |
| it exits. Then the first session will take over console again. |
| |
| NuTTY |
| ===== |
| |
| In a previous discussion, there was talk about implementing the moral equivalent |
| of getty in NuttX (of course, it would be called "nutty"). A simple |
| implementation of nutty would work like this: |
| |
| 1. It would wait on ``poll()`` on every (configured) serial device. |
| 2. Whenever it is awakened, it would start something like ``my_main()`` above |
| on the active serial port. |
| 3. NSH has an option to enable logins, but it would be better to remove the |
| existing login information from NSH and centralize it in nutty. |
| |
| That way, you could connect to any TTY, hit enter, and you would get an NSH |
| session. Hmm... it is not clear how nutty would get the TTY back after the |
| session is closed. That part may require some additional thought. |
| |
| Other Ideas |
| =========== |
| |
| There are other ways to get multiple NSH sessions: |
| |
| - Telnet already supports multiple sessions. |
| - Implement the existing NSH as an ELF program, then you can get multiple NSH |
| sessions with ``posix_spawn`` by simply redirecting I/O. |
| - Using the tiny NxWM window managers, multiple NSH windows are already |
| supported. |