Right, but if you run an application in a terminal, they will all be
dup()'d file descriptors referencing the same object (open()ed from some
/dev/pty). On most (maybe all) *nix, O_NONBLOCK is an attribute of that
object, not the descriptors - if you change one, you change them all.

tmux only changes stdin, but your stdout and stderr point to the same
object so they will be changed too.



On Wed, Nov 16, 2016 at 06:01:43AM +0530, Prabhuram K wrote:
>    As for as I know STDIN STDOUT STDERR fds are defined with 0, 1 and 2. I
>    can try the patch anyway.** Thanks again.
> 
>    On Nov 16, 2016 5:54 AM, "Nicholas Marriott"
>    <[1][email protected]> wrote:
> 
>      stdin and stdout and stderr are probably all the same file descriptor.
> 
>      On Wed, Nov 16, 2016 at 05:53:52AM +0530, Prabhuram K wrote:
>      >** ** Hi Nicholas,
>      >** ** Thanks a lot for the patch. But it's not just STDIN. setting to
>      blocking.
>      >** ** Even STDOUT and STDERR also going back to blocking state. Do I
>      need to add
>      >** ** similar code for other fds?
>      >
>      >** ** BTW: Your question on why reinitialize back, I am running with a
>      real time
>      >** ** system and I run my application multiple instances under tmux and
>      >** ** sometimes simultaneously. So I don't want this to be done from my
>      >** ** application rather from tmux itself.
>      >
>      >** ** Thanks a lot for your help
>      >
>      >** ** Regards,
>      >** ** Prabhu
>      >
>      >** ** On Nov 16, 2016 5:17 AM, "Nicholas Marriott"
>      >** ** <[1][2][email protected]> wrote:
>      >
>      >** ** ** You could try this:
>      >
>      >** ** ** Index: client.c
>      >** ** **
>      ===================================================================
>      >** ** ** RCS file: /cvs/src/usr.bin/tmux/client.c,v
>      >** ** ** retrieving revision 1.114
>      >** ** ** diff -u -p -r1.114 client.c
>      >** ** ** --- client.c** ** 3 Oct 2016 22:52:11 -0000** ** ** **1.114
>      >** ** ** +++ client.c** ** 15 Nov 2016 23:47:22 -0000
>      >** ** ** @@ -38,6 +38,7 @@ static struct tmuxproc** ** ** **
>      *client_proc;
>      >** ** ** **static struct tmuxpeer *client_peer;
>      >** ** ** **static int** ** ** ** ** ** ** client_flags;
>      >** ** ** **static struct event** ** **client_stdin;
>      >** ** ** +static int** ** ** ** ** ** ** client_stdin_blocking;
>      >** ** ** **static enum {
>      >** ** ** ** ** ** ** CLIENT_EXIT_NONE,
>      >** ** ** ** ** ** ** CLIENT_EXIT_DETACHED,
>      >** ** ** @@ -306,10 +307,12 @@ client_main(struct event_base *base, int
>      >** ** ** ** ** ** ** options_free(global_w_options);
>      >** ** ** ** ** ** ** environ_free(global_environ);
>      >
>      >** ** ** -** ** ** **/* Create stdin handler. */
>      >** ** ** -** ** ** **setblocking(STDIN_FILENO, 0);
>      >** ** ** +** ** ** **/* Create stdin event. */
>      >** ** ** ** ** ** ** event_set(&client_stdin, STDIN_FILENO,
>      EV_READ|EV_PERSIST,
>      >** ** ** ** ** ** ** ** ** client_stdin_callback, NULL);
>      >** ** ** +** ** ** **client_stdin_blocking = getblocking(STDIN_FILENO);
>      >** ** ** +
>      >** ** ** +** ** ** **/* Configure terminal for control mode. */
>      >** ** ** ** ** ** ** if (client_flags & CLIENT_CONTROLCONTROL) {
>      >** ** ** ** ** ** ** ** ** ** ** if (tcgetattr(STDIN_FILENO,
>      &saved_tio) != 0)
>      >** ** ** ** ** ** ** ** ** ** ** ** ** ** ** fatal("tcgetattr failed");
>      >** ** ** @@ -375,7 +378,7 @@ client_main(struct event_base *base, int
>      >** ** ** ** ** ** ** ** ** ** ** tcsetattr(STDOUT_FILENO, TCSAFLUSH,
>      &saved_tio);
>      >** ** ** ** ** ** ** } else if (client_exitreason != CLIENT_EXIT_NONE)
>      >** ** ** ** ** ** ** ** ** ** ** fprintf(stderr, "%s\n",
>      client_exit_message());
>      >** ** ** -** ** ** **setblocking(STDIN_FILENO, 1);
>      >** ** ** +** ** ** **setblocking(STDIN_FILENO, client_stdin_blocking);
>      >** ** ** ** ** ** ** return (client_exitval);
>      >** ** ** **}
>      >
>      >** ** ** @@ -585,6 +588,7 @@ client_dispatch_wait(struct imsg *imsg,
>      >** ** ** ** ** ** ** ** ** ** ** if (datalen != 0)
>      >** ** ** ** ** ** ** ** ** ** ** ** ** ** ** fatalx("bad MSG_STDIN
>      size");
>      >
>      >** ** ** +** ** ** ** ** ** ** **setblocking(STDIN_FILENO, 0);
>      >** ** ** ** ** ** ** ** ** ** ** event_add(&client_stdin, NULL);
>      >** ** ** ** ** ** ** ** ** ** ** break;
>      >** ** ** ** ** ** ** case MSG_STDOUT:
>      >** ** ** Index: tmux.c
>      >** ** **
>      ===================================================================
>      >** ** ** RCS file: /cvs/src/usr.bin/tmux/tmux.c,v
>      >** ** ** retrieving revision 1.172
>      >** ** ** diff -u -p -r1.172 tmux.c
>      >** ** ** --- tmux.c** ** ** 11 Oct 2016 13:21:59 -0000** ** ** 1.172
>      >** ** ** +++ tmux.c** ** ** 15 Nov 2016 23:47:22 -0000
>      >** ** ** @@ -150,18 +150,31 @@ fail:
>      >** ** ** ** ** ** ** return (NULL);
>      >** ** ** **}
>      >
>      >** ** ** +int
>      >** ** ** +getblocking(int fd)
>      >** ** ** +{
>      >** ** ** +** ** ** **int** ** **mode;
>      >** ** ** +
>      >** ** ** +** ** ** **if ((mode = fcntl(fd, F_GETFL)) == -1)
>      >** ** ** +** ** ** ** ** ** ** **return (-1);
>      >** ** ** +** ** ** **if (mode & O_NONBLOCK)
>      >** ** ** +** ** ** ** ** ** ** **return (0);
>      >** ** ** +** ** ** **return (1);
>      >** ** ** +}
>      >** ** ** +
>      >** ** ** **void
>      >** ** ** **setblocking(int fd, int state)
>      >** ** ** **{
>      >** ** ** -** ** ** **int mode;
>      >** ** ** +** ** ** **int** ** **mode, new_mode;
>      >
>      >** ** ** -** ** ** **if ((mode = fcntl(fd, F_GETFL)) != -1) {
>      >** ** ** -** ** ** ** ** ** ** **if (!state)
>      >** ** ** -** ** ** ** ** ** ** ** ** ** ** **mode |= O_NONBLOCK;
>      >** ** ** -** ** ** ** ** ** ** **else
>      >** ** ** -** ** ** ** ** ** ** ** ** ** ** **mode &= ~O_NONBLOCK;
>      >** ** ** +** ** ** **if (state == -1 || (mode = fcntl(fd, F_GETFL)) ==
>      -1)
>      >** ** ** +** ** ** ** ** ** ** **return;
>      >** ** ** +** ** ** **if (state)
>      >** ** ** +** ** ** ** ** ** ** **new_mode = (mode | O_NONBLOCK);
>      >** ** ** +** ** ** **else
>      >** ** ** +** ** ** ** ** ** ** **new_mode = (mode & ~O_NONBLOCK);
>      >** ** ** +** ** ** **if (new_mode != mode)
>      >** ** ** ** ** ** ** ** ** ** ** fcntl(fd, F_SETFL, mode);
>      >** ** ** -** ** ** **}
>      >** ** ** **}
>      >
>      >** ** ** **const char *
>      >** ** ** Index: tmux.h
>      >** ** **
>      ===================================================================
>      >** ** ** RCS file: /cvs/src/usr.bin/tmux/tmux.h,v
>      >** ** ** retrieving revision 1.677
>      >** ** ** diff -u -p -r1.677 tmux.h
>      >** ** ** --- tmux.h** ** ** 15 Nov 2016 15:17:28 -0000** ** ** 1.677
>      >** ** ** +++ tmux.h** ** ** 15 Nov 2016 23:47:23 -0000
>      >** ** ** @@ -1105,6 +1105,7 @@ struct tty {
>      >** ** ** ** ** ** ** struct tty_term *term;
>      >
>      >** ** ** ** ** ** ** int** ** ** ** ** ** ** fd;
>      >** ** ** +** ** ** **int** ** ** ** ** ** ** blocking;
>      >** ** ** ** ** ** ** struct bufferevent *event;
>      >
>      >** ** ** ** ** ** ** struct termios** **tio;
>      >** ** ** @@ -1512,6 +1513,7 @@ extern struct environ** **
>      ***global_environ;
>      >** ** ** **extern struct timeval** **start_time;
>      >** ** ** **extern const char** ** ** *socket_path;
>      >** ** ** **int** ** ** ** ** ** **areshell(const char *);
>      >** ** ** +int** ** ** ** ** ** **getblocking(int);
>      >** ** ** **void** ** ** ** ** ** setblocking(int, int);
>      >** ** ** **const char** ** ***find_home(void);
>      >
>      >** ** ** Index: tty.c
>      >** ** **
>      ===================================================================
>      >** ** ** RCS file: /cvs/src/usr.bin/tmux/tty.c,v
>      >** ** ** retrieving revision 1.214
>      >** ** ** diff -u -p -r1.214 tty.c
>      >** ** ** --- tty.c** ** ** **15 Nov 2016 15:17:28 -0000** ** ** 1.214
>      >** ** ** +++ tty.c** ** ** **15 Nov 2016 23:47:23 -0000
>      >** ** ** @@ -237,6 +237,7 @@ tty_init_termios(int fd, struct termios
>      >** ** ** **void
>      >** ** ** **tty_start_tty(struct tty *tty)
>      >** ** ** **{
>      >** ** ** +** ** ** **tty->blocking = getblocking(tty->fd);
>      >** ** ** ** ** ** ** tty_init_termios(tty->fd, &tty->tio, tty->event);
>      >
>      >** ** ** ** ** ** ** tty_putcode(tty, TTYC_SMCUP);
>      >** ** ** @@ -330,7 +331,7 @@ tty_stop_tty(struct tty *tty)
>      >** ** ** ** ** ** ** ** ** ** ** tty_raw(tty, "\033[?69l"); /* DECLRMM
>      */
>      >** ** ** ** ** ** ** tty_raw(tty, tty_term_string(tty->term,
>      TTYC_RMCUP));
>      >
>      >** ** ** -** ** ** **setblocking(tty->fd, 1);
>      >** ** ** +** ** ** **setblocking(tty->fd, tty->blocking);
>      >** ** ** **}
>      >
>      >** ** ** **void
>      >
>      >** ** ** On Tue, Nov 15, 2016 at 11:33:02PM +0000, Nicholas Marriott
>      wrote:
>      >** ** ** > tmux sets stdin nonblocking then sets it blocking again on
>      exit, we
>      >** ** ** > could probably not do that unless we are going to use it,
>      and restore
>      >** ** ** > it only if it wasn't already nonblocking. But TBH does it
>      matter that
>      >** ** ** > much? Why not just set it nonblocking yourself after you run
>      tmux?
>      >** ** ** >
>      >** ** ** >
>      >** ** ** > On Tue, Nov 15, 2016 at 11:01:54PM +0530, Prabhuram K wrote:
>      >** ** ** > >** ** Hi,
>      >** ** ** > >** ** I have an application and run it under tmux.
>      >** ** ** > >** ** The application sets** STDIN_FILENO, STDOUT_FILENO
>      and
>      >** ** ** STDERR_FILENO to
>      >** ** ** > >** ** nonblocking using fcntl calls.
>      >** ** ** > >** ** The application internally loads the tmux
>      configuration file
>      >** ** ** using system
>      >** ** ** > >** ** command (tmux source-file xxx). Soon after this is
>      executed
>      >** ** ** inside from my
>      >** ** ** > >** ** application, all the STDIN/STDOUT/STDERR fds sets
>      back to
>      >** ** ** blocking state.
>      >** ** ** > >** ** Not sure what is the problem here. Why tmux always
>      sets the fds
>      >** ** ** to
>      >** ** ** > >** ** blocking state. Is there a way to always set to
>      non-blocking.
>      >** ** ** > >** ** Any help is highly appreciated.
>      >** ** ** > >
>      >** ** ** > >** ** Thanks,
>      >** ** ** > >** ** Prabhu
>      >** ** ** > >
>      >** ** ** > >** ** --
>      >** ** ** > >** ** You received this message because you are subscribed
>      to the
>      >** ** ** Google Groups
>      >** ** ** > >** ** "tmux-users" group.
>      >** ** ** > >** ** To unsubscribe from this group and stop receiving
>      emails from
>      >** ** ** it, send an
>      >** ** ** > >** ** email to
>      [1][2][3][email protected].
>      >** ** ** > >** ** To post to this group, send email to
>      >** ** ** [2][3][4][email protected].
>      >** ** ** > >** ** For more options, visit
>      >** ** ** [3][4][5]https://groups.google.com/d/optout.
>      >** ** ** > >
>      >** ** ** > > References
>      >** ** ** > >
>      >** ** ** > >** ** Visible links
>      >** ** ** > >** ** 1.
>      mailto:[5][6][email protected]
>      >** ** ** > >** ** 2. mailto:[6][7][email protected]
>      >** ** ** > >** ** 3. [7][8]https://groups.google.com/d/optout
>      >
>      > References
>      >
>      >** ** Visible links
>      >** ** 1. mailto:[9][email protected]
>      >** ** 2. mailto:[10]tmux-users%[email protected]
>      >** ** 3. mailto:[11][email protected]
>      >** ** 4. [12]https://groups.google.com/d/optout
>      >** ** 5. mailto:[13]tmux-users%[email protected]
>      >** ** 6. mailto:[14][email protected]
>      >** ** 7. [15]https://groups.google.com/d/optout
> 
>    --
>    You received this message because you are subscribed to the Google Groups
>    "tmux-users" group.
>    To unsubscribe from this group and stop receiving emails from it, send an
>    email to [16][email protected].
>    To post to this group, send email to [17][email protected].
>    For more options, visit [18]https://groups.google.com/d/optout.
> 
> References
> 
>    Visible links
>    1. mailto:[email protected]
>    2. mailto:[email protected]
>    3. mailto:tmux-users%[email protected]
>    4. mailto:[email protected]
>    5. https://groups.google.com/d/optout
>    6. mailto:tmux-users%[email protected]
>    7. mailto:[email protected]
>    8. https://groups.google.com/d/optout
>    9. mailto:[email protected]
>   10. mailto:tmux-users%[email protected]
>   11. mailto:[email protected]
>   12. https://groups.google.com/d/optout
>   13. mailto:tmux-users%[email protected]
>   14. mailto:[email protected]
>   15. https://groups.google.com/d/optout
>   16. mailto:[email protected]
>   17. mailto:[email protected]
>   18. https://groups.google.com/d/optout

-- 
You received this message because you are subscribed to the Google Groups 
"tmux-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send an email to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to