Stopping a while loop with user input ?

Discussion in 'C Programming' started by ern, Oct 12, 2005.

  1. ern

    ern Guest

    I have a program that runs scripts. If the user types "script
    myScript.dat" the program will grab commands from the text file, verify
    correctness, and begin executing the script UNTIL...

    I need a way to stop the execution with user input. I was thinking
    something like this:

    while(user hasn't pressed 'any key'){
    keepExecutingScript();
    }

    How can I do the "user hasn't pressed 'any key' " of this logic?
    Running Linux Red Hat V3.

    Thanks,
     
    ern, Oct 12, 2005
    #1
    1. Advertising

  2. ern

    Michael Mair Guest

    ern wrote:
    > I have a program that runs scripts. If the user types "script
    > myScript.dat" the program will grab commands from the text file, verify
    > correctness, and begin executing the script UNTIL...
    >
    > I need a way to stop the execution with user input. I was thinking
    > something like this:
    >
    > while(user hasn't pressed 'any key'){
    > keepExecutingScript();
    > }
    >
    > How can I do the "user hasn't pressed 'any key' " of this logic?
    > Running Linux Red Hat V3.


    This cannot done in standard C; try comp.unix.programmer

    Cheers
    Michael
    --
    E-Mail: Mine is an /at/ gmx /dot/ de address.
     
    Michael Mair, Oct 12, 2005
    #2
    1. Advertising

  3. ern

    Default User Guest

    ern wrote:



    > I need a way to stop the execution with user input. I was thinking
    > something like this:
    >
    > while(user hasn't pressed 'any key'){
    > keepExecutingScript();
    > }



    http://www.eskimo.com/~scs/C-faq/q19.1.html



    Brian

    --
    Please quote enough of the previous message for context. To do so from
    Google, click "show options" and use the Reply shown in the expanded
    header.
     
    Default User, Oct 12, 2005
    #3
  4. In article <>,
    ern <> wrote:
    >I have a program that runs scripts. If the user types "script
    >myScript.dat" the program will grab commands from the text file, verify
    >correctness, and begin executing the script UNTIL...
    >
    >I need a way to stop the execution with user input. I was thinking
    >something like this:
    >
    >while(user hasn't pressed 'any key'){
    > keepExecutingScript();
    >}


    If you're allowed to choose which key the user uses to interrupt the
    program, there's a good chance you can do this without going beyond what
    the standard defines.
    (This may or may not be something you'd want to do instead of using
    something system-specific instead.)

    Most implementations have a way to cause SIGINT to be raised in a running
    program, so you can just install a handler that sets a flag indicating
    it's time to stop, and check that in your main loop.
    (Note that the way you arrange for SIGINT to be raised asynchronously
    is entirely dependent on your system and there may not be a way at all.
    (All of the systems that used nontrivially use ctrl-C by default, but
    check your documentation.) So you're not actually gaining portability
    to systems that don't support user-caused SIGINT, you're just gaining
    not having to change the code to move between systems that do.)

    --------
    #include <signal.h>

    volatile sig_atomic_t time_to_stop=0;

    void sigint_handler(int ignored)
    {
    time_to_stop=1;
    /*Revert to the default signal handler (usually immediate
    termination) for if the user gets impatient and interrupts
    again
    */
    signal(SIGINT,SIG_DFL);
    }

    void do_main_loop(some_args args)
    {
    void (*old_sighandler)(int);

    old_sighandler=signal(SIGINT,sigint_handler);
    if(old_sighandler==SIG_IGN)
    {
    /*Assume it was ignored for a good reason, re-ignore*/
    signal(SIGINT,SIG_IGN);
    }
    if(old_sighandler==SIG_ERR)
    {
    report_signal_installation_error();
    abort_if_we_dont_want_to_continue_uninterruptible();
    }

    while(time_to_stop==0)
    {
    keep_executing_script(args);
    }
    do_any_cleanup_required();

    /*Depending on what comes next, we may want to restore the original
    handler:
    */
    if(old_sighandler!=SIG_ERR)
    signal(SIGINT,old_sighandler);
    }
    --------

    Note that the things you can do in a handler for an asynchronous signal
    are seriously limited. Storing a value in an object of type volatile
    sig_atomic_t is guaranteed to do what you'd expect (store the value
    completely and correctly and become available the next time it's checked
    outside the signal handler), and using signal() to install a new handler
    for the signal you're handling is also well-defined. Calling most library
    functions isn't safe, examining and/or modifying most objects isn't safe,
    and there's really not a whole lot that you can do without trying to do
    one or the other of those.


    dave

    --
    Dave Vandervies

    Don't write in troglodyte here, it annoys the natives.
    --Lawrence Kirby in comp.lang.c
     
    Dave Vandervies, Oct 20, 2005
    #4
  5. ern

    Mabden Guest

    "ern" <> wrote in message
    news:...
    > I have a program that runs scripts. If the user types "script
    > myScript.dat" the program will grab commands from the text file,

    verify
    > correctness, and begin executing the script UNTIL...
    >
    > I need a way to stop the execution with user input. I was thinking
    > something like this:
    >
    > while(user hasn't pressed 'any key'){
    > keepExecutingScript();
    > }
    >
    > How can I do the "user hasn't pressed 'any key' " of this logic?
    > Running Linux Red Hat V3.


    getch() might work.

    --
    Mabden
     
    Mabden, Oct 26, 2005
    #5
  6. ern

    Jordan Abel Guest

    On 2005-10-26, Mabden <mabden@sbc_global.net> wrote:
    > "ern" <> wrote in message
    > news:...
    >> I have a program that runs scripts. If the user types "script
    >> myScript.dat" the program will grab commands from the text file,

    > verify
    >> correctness, and begin executing the script UNTIL...
    >>
    >> I need a way to stop the execution with user input. I was thinking
    >> something like this:
    >>
    >> while(user hasn't pressed 'any key'){
    >> keepExecutingScript();
    >> }
    >>
    >> How can I do the "user hasn't pressed 'any key' " of this logic?
    >> Running Linux Red Hat V3.

    >
    > getch() might work.


    however, you need curses for that. The only "portable" way to do
    this would be to use SIGINT and limit the user's ability to stop
    the "script" to causing SIGINT (in an implementation-defined way:
    on any unix system this is controlled by the tty driver and is
    caused by default by hitting ctrl-c - it's not unreasonable to
    use ctrl-c and/or ctrl-break on windows/dos, etc.)

    your signal handler could set a global variable that is then
    checked in the while loop.

    it's also a lot easier than using curses, and a lot more in
    keeping with how other unix-ish applications do things.
     
    Jordan Abel, Oct 26, 2005
    #6
  7. ern

    Jordan Abel Guest

    On 2005-10-26, Mabden <mabden@sbc_global.net> wrote:
    > "Jordan Abel" <> wrote in message
    > news:...
    >> On 2005-10-26, Mabden <mabden@sbc_global.net> wrote:
    >> > "ern" <> wrote in message
    >> > news:...
    >> >> I have a program that runs scripts. If the user types "script
    >> >> myScript.dat" the program will grab commands from the text file,
    >> > verify
    >> >> correctness, and begin executing the script UNTIL...
    >> >>
    >> >> I need a way to stop the execution with user input. I was thinking
    >> >> something like this:
    >> >>
    >> >> while(user hasn't pressed 'any key'){
    >> >> keepExecutingScript();
    >> >> }
    >> >>
    >> >> How can I do the "user hasn't pressed 'any key' " of this logic?
    >> >> Running Linux Red Hat V3.
    >> >
    >> > getch() might work.

    >>
    >> however, you need curses for that. The only "portable" way to do
    >> this would be to use SIGINT and limit the user's ability to stop
    >> the "script" to causing SIGINT (in an implementation-defined way:
    >> on any unix system this is controlled by the tty driver and is
    >> caused by default by hitting ctrl-c - it's not unreasonable to
    >> use ctrl-c and/or ctrl-break on windows/dos, etc.)
    >>
    >> your signal handler could set a global variable that is then
    >> checked in the while loop.
    >>
    >> it's also a lot easier than using curses, and a lot more in
    >> keeping with how other unix-ish applications do things.

    >
    > Curses? Unixish? what's that? My 'puter speaks DOS. My compiler knows
    > getch() and so does my bible, the K&R.


    there is a getch() that exists on DOS and one that exists on unix.
    they do not have the same semantics. K&R uses the name, but it is
    for neither of the two commonly-existing functions of that name, but
    rather of its own example of how one might write a getc-ish function
    that could play nice with an ungetc-ish one. Moreover, the getch in
    K&R, the one in unix/curses under some circumstances, and the dos
    one, will ALL block until the user actually presses a key - none of
    them [except the curses one under SOME sets of options] will return
    immediately if there is no key pressed by the user.

    > Can't he read a line of script and then check if a key was hit? I mean,
    > the one line of the script may take a little while to finish, but at
    > least the whole script doesn't have to finish before the user gets
    > control.


    he _can_ do it, using the curses getch()

    > SIGINT is fine, but seems overkill for processing a script, since you
    > can just poll after every line. I use SIGINT for trapping Ctrl-C to stop
    > something lengthy like parsing a directory tree, but a script file of
    > presumably short-lived commands could be halted by just polling the
    > keyboard buffer with getch(). Unless the script was something like:


    the problem is that getch() will not return if there is _not_ a
    character. [well, you can do it with curses, but it's tricky]
     
    Jordan Abel, Oct 26, 2005
    #7
  8. ern

    Mabden Guest

    "Jordan Abel" <> wrote in message
    news:...
    > On 2005-10-26, Mabden <mabden@sbc_global.net> wrote:
    > > "ern" <> wrote in message
    > > news:...
    > >> I have a program that runs scripts. If the user types "script
    > >> myScript.dat" the program will grab commands from the text file,

    > > verify
    > >> correctness, and begin executing the script UNTIL...
    > >>
    > >> I need a way to stop the execution with user input. I was thinking
    > >> something like this:
    > >>
    > >> while(user hasn't pressed 'any key'){
    > >> keepExecutingScript();
    > >> }
    > >>
    > >> How can I do the "user hasn't pressed 'any key' " of this logic?
    > >> Running Linux Red Hat V3.

    > >
    > > getch() might work.

    >
    > however, you need curses for that. The only "portable" way to do
    > this would be to use SIGINT and limit the user's ability to stop
    > the "script" to causing SIGINT (in an implementation-defined way:
    > on any unix system this is controlled by the tty driver and is
    > caused by default by hitting ctrl-c - it's not unreasonable to
    > use ctrl-c and/or ctrl-break on windows/dos, etc.)
    >
    > your signal handler could set a global variable that is then
    > checked in the while loop.
    >
    > it's also a lot easier than using curses, and a lot more in
    > keeping with how other unix-ish applications do things.


    Curses? Unixish? what's that? My 'puter speaks DOS. My compiler knows
    getch() and so does my bible, the K&R.

    Can't he read a line of script and then check if a key was hit? I mean,
    the one line of the script may take a little while to finish, but at
    least the whole script doesn't have to finish before the user gets
    control.

    SIGINT is fine, but seems overkill for processing a script, since you
    can just poll after every line. I use SIGINT for trapping Ctrl-C to stop
    something lengthy like parsing a directory tree, but a script file of
    presumably short-lived commands could be halted by just polling the
    keyboard buffer with getch(). Unless the script was something like:

    1 cure cancer
    2 cure Michael Jackson
    3 fix Madben

    --
    Mabden



    --
    Mabden
     
    Mabden, Oct 26, 2005
    #8
  9. ern

    Mabden Guest

    "Jordan Abel" <> wrote in message
    news:...
    > On 2005-10-26, Mabden <mabden@sbc_global.net> wrote:
    > the problem is that getch() will not return if there is _not_ a
    > character. [well, you can do it with curses, but it's tricky]


    Oops.. so That's why I use SIGINT... I looked back at some DOS programs
    and there were more of them than I remembered. But they all seemed to be
    for Ctrl-C handling.

    Did the OP say they wanted to trap "The Any Key" or a specific key? Does
    SIGINT flag, say a space bar? I forget, since I used it to exit
    gracefully from a program when ctrl-c or ctrl-break was hit. What about
    the old ctrl-d ctrl-s combo for pausing and restarting a program, maybe
    that might work for the OP.

    I guess I need to read the first post. ;-)

    --
    Mabden
     
    Mabden, Oct 26, 2005
    #9
  10. ern

    Joe Wright Guest

    Mabden wrote:
    > "ern" <> wrote in message
    > news:...
    >
    >>I have a program that runs scripts. If the user types "script
    >>myScript.dat" the program will grab commands from the text file,

    >
    > verify
    >
    >>correctness, and begin executing the script UNTIL...
    >>
    >>I need a way to stop the execution with user input. I was thinking
    >>something like this:
    >>
    >>while(user hasn't pressed 'any key'){
    >> keepExecutingScript();
    >>}
    >>
    >>How can I do the "user hasn't pressed 'any key' " of this logic?
    >>Running Linux Red Hat V3.

    >
    >
    > getch() might work.
    >

    Just when I thought you were learning.. getch() simply does not exist in
    Standard C, the topic of this newsgroup. Various implementations may
    provide it (an others) as extensions but it isn't C.

    --
    Joe Wright
    "Everything should be made as simple as possible, but not simpler."
    --- Albert Einstein ---
     
    Joe Wright, Oct 26, 2005
    #10
  11. ern

    Mabden Guest

    "Joe Wright" <> wrote in message
    news:...
    > Mabden wrote:
    > > getch() might work.
    > >

    > Just when I thought you were learning.. getch() simply does not exist

    in
    > Standard C, the topic of this newsgroup. Various implementations may
    > provide it (an others) as extensions but it isn't C.
    >


    Awww.. how sweet, you thought...

    getch() is on page 78-79 of the only C standard that matters, K&R2.

    I've never compiled a program using getch() and had it fail. But as I
    said, I was surprized to find that I actually used SIGINT more than I
    thought, and getch() less than you think.

    So, while you are not wrong - you're wrong! ;-)

    --
    Mabden
     
    Mabden, Oct 27, 2005
    #11
  12. ern

    Jordan Abel Guest

    On 2005-10-27, Mabden <mabden@sbc_global.net> wrote:
    > "Joe Wright" <> wrote in message
    > news:...
    >> Mabden wrote:
    >> > getch() might work.
    >> >

    >> Just when I thought you were learning.. getch() simply does not
    >> exist in Standard C, the topic of this newsgroup. Various
    >> implementations may provide it (an others) as extensions but it
    >> isn't C.

    >
    > Awww.. how sweet, you thought...
    >
    > getch() is on page 78-79 of the only C standard that matters,
    > K&R2.
    >
    > I've never compiled a program using getch() and had it fail. But
    > as I said, I was surprized to find that I actually used SIGINT
    > more than I thought, and getch() less than you think.
    >
    > So, while you are not wrong - you're wrong! ;-)


    You are incorrect. K&R2 does NOT claim getch() exists or a standard
    function. It uses the name in an example, which is in fact an
    implicit claim that it is NOT a standard function
     
    Jordan Abel, Oct 27, 2005
    #12
  13. ern

    Flash Gordon Guest

    Mabden wrote:
    > "Joe Wright" <> wrote in message
    > news:...
    >
    >>Mabden wrote:
    >>
    >>>getch() might work.

    >>
    >>Just when I thought you were learning.. getch() simply does not exist
    >>in
    >>Standard C, the topic of this newsgroup. Various implementations may
    >>provide it (an others) as extensions but it isn't C.

    >
    > Awww.. how sweet, you thought...
    >
    > getch() is on page 78-79 of the only C standard that matters, K&R2.


    Where it provides an implementation of getch which has different
    semantics to the implementation I have on my Linux box and different
    semantics to the implementation provided my MS in their C library. If
    you look at Appendix B which describes the standard library you will
    find absolutely NO reference to getch.

    Also, it is the ISO standard that defines C and therefore what is
    topical here, K&R2 is merely a very good, but not perfect, book about
    the language.

    > I've never compiled a program using getch() and had it fail.


    Which proves nothing apart from your experience being limited.

    > But as I
    > said, I was surprized to find that I actually used SIGINT more than I
    > thought, and getch() less than you think.
    >
    > So, while you are not wrong - you're wrong! ;-)


    No, Joe is COMPLETELY correct and you are COMPLETELY wrong.

    Since you are obviously not improving I'll put you back in the kill file.
    --
    Flash Gordon
    Living in interesting times.
    Although my email address says spam, it is real and I read it.
     
    Flash Gordon, Oct 27, 2005
    #13
  14. ern

    Mabden Guest

    "Flash Gordon" <> wrote in message
    news:-gordon.me.uk...
    > Since you are obviously not improving I'll put you back in the kill

    file.
    Hey! I just got to stretch my legs! Haven't you ever been wrong!!

    --
    Mabden
     
    Mabden, Oct 27, 2005
    #14
  15. ern

    pete Guest

    Jordan Abel wrote:

    > K&R2 does NOT claim getch() exists or a standard function.


    You are correct.

    > It uses the name in an example, which is in fact an
    > implicit claim that it is NOT a standard function


    You would think so, but there is a counterexample in K&R.

    http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html

    119-121(§5.11): The qsort discussion needs recasting in several ways.
    First, qsort is a standard routine in ANSI/ISO C, so
    the rendition here should be given a different name, especially because
    the arguments to standard qsort are a bit different: the
    standard accepts a base pointer and a count, while this example uses a
    base pointer and two offsets.

    --
    pete
     
    pete, Oct 28, 2005
    #15
  16. pete <> writes:
    > Jordan Abel wrote:
    >
    >> K&R2 does NOT claim getch() exists or a standard function.

    >
    > You are correct.
    >
    >> It uses the name in an example, which is in fact an
    >> implicit claim that it is NOT a standard function

    >
    > You would think so, but there is a counterexample in K&R.
    >
    > http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html
    >
    > 119-121(§5.11): The qsort discussion needs recasting in several ways.
    > First, qsort is a standard routine in ANSI/ISO C, so
    > the rendition here should be given a different name, especially because
    > the arguments to standard qsort are a bit different: the
    > standard accepts a base pointer and a count, while this example uses a
    > base pointer and two offsets.


    But using the name "qsort" in an example *is* an implicit claim that
    it's not a standard function. It happens to be an incorrect claim,
    which is why it's mentioned in the errata.

    --
    Keith Thompson (The_Other_Keith) <http://www.ghoti.net/~kst>
    San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
    We must do something. This is something. Therefore, we must do this.
     
    Keith Thompson, Oct 28, 2005
    #16
  17. ern

    Mabden Guest

    "Keith Thompson" <> wrote in message
    news:...
    > pete <> writes:
    > > Jordan Abel wrote:
    > >
    > >> K&R2 does NOT claim getch() exists or a standard function.

    > >
    > > You are correct.
    > >
    > >> It uses the name in an example, which is in fact an
    > >> implicit claim that it is NOT a standard function

    > >
    > > You would think so, but there is a counterexample in K&R.
    > >
    > > http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html
    > >
    > > 119-121(§5.11): The qsort discussion needs recasting in several

    ways.
    > > First, qsort is a standard routine in ANSI/ISO C, so
    > > the rendition here should be given a different name, especially

    because
    > > the arguments to standard qsort are a bit different: the
    > > standard accepts a base pointer and a count, while this example uses

    a
    > > base pointer and two offsets.

    >
    > But using the name "qsort" in an example *is* an implicit claim that
    > it's not a standard function. It happens to be an incorrect claim,
    > which is why it's mentioned in the errata.


    So none of the programs named in K&R (2 in my version) are actually in
    The Standard? Is that canonical? Have you checked this yourself, or is
    it hearsay?

    --
    Mabden
     
    Mabden, Oct 28, 2005
    #17
  18. ern

    Jordan Abel Guest

    On 2005-10-28, Mabden <mabden@sbc_global.net> wrote:
    > "Keith Thompson" <> wrote in message
    > news:...
    >> pete <> writes:
    >> > Jordan Abel wrote:
    >> >
    >> >> K&R2 does NOT claim getch() exists or a standard function.
    >> >
    >> > You are correct.
    >> >
    >> >> It uses the name in an example, which is in fact an
    >> >> implicit claim that it is NOT a standard function
    >> >
    >> > You would think so, but there is a counterexample in K&R.
    >> >
    >> > http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html
    >> >
    >> > 119-121(§5.11): The qsort discussion needs recasting in several

    > ways.
    >> > First, qsort is a standard routine in ANSI/ISO C, so
    >> > the rendition here should be given a different name, especially

    > because
    >> > the arguments to standard qsort are a bit different: the
    >> > standard accepts a base pointer and a count, while this example uses

    > a
    >> > base pointer and two offsets.

    >>
    >> But using the name "qsort" in an example *is* an implicit claim that
    >> it's not a standard function. It happens to be an incorrect claim,
    >> which is why it's mentioned in the errata.

    >
    > So none of the programs named in K&R (2 in my version) are actually in
    > The Standard? Is that canonical? Have you checked this yourself, or is
    > it hearsay?


    No program which contains a definition of a standard function is
    permitted on a conforming hosted implementation. With the sole (i
    believe) exceptions of the qsort function and the unix-specific
    examples in chapter 8, all the examples in K&R conform to the
    standard.
     
    Jordan Abel, Oct 28, 2005
    #18
  19. On Fri, 28 Oct 2005 10:43:44 +0000 (UTC), in comp.lang.c , Jordan Abel
    <> wrote:

    >No program which contains a definition of a standard function is
    >permitted on a conforming hosted implementation.


    I believe thats incorrect. My understanding is that the names are only
    reserved if you include the header.

    7.1.3 Reserved Identifiers
    - Each identifier with file scope listed in any of the following
    subclauses (including the future library directions) is reserved for
    use as a macro name and as an identifier with file scope in the same
    name space if any of its associated headers is included.

    --
    Mark McIntyre
    CLC FAQ <http://www.eskimo.com/~scs/C-faq/top.html>
    CLC readme: <http://www.ungerhu.com/jxh/clc.welcome.txt>

    ----== Posted via Newsfeeds.Com - Unlimited-Uncensored-Secure Usenet News==----
    http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ Newsgroups
    ----= East and West-Coast Server Farms - Total Privacy via Encryption =----
     
    Mark McIntyre, Oct 28, 2005
    #19
  20. ern

    Flash Gordon Guest

    Mark McIntyre wrote:
    > On Fri, 28 Oct 2005 10:43:44 +0000 (UTC), in comp.lang.c , Jordan Abel
    > <> wrote:
    >
    >>No program which contains a definition of a standard function is
    >>permitted on a conforming hosted implementation.

    >
    > I believe thats incorrect. My understanding is that the names are only
    > reserved if you include the header.
    >
    > 7.1.3 Reserved Identifiers
    > - Each identifier with file scope listed in any of the following
    > subclauses (including the future library directions) is reserved for
    > use as a macro name and as an identifier with file scope in the same
    > name space if any of its associated headers is included.


    In n1124, section 7.13, it also says:
    — All identifiers with external linkage in any of the following
    subclauses (including the future library directions) are always
    reserved for use as identifiers with external linkage.157)

    So you can never use the names for functions unless you don't include
    the relevant header *and* you declare the function as static.
    --
    Flash Gordon
    Living in interesting times.
    Although my email address says spam, it is real and I read it.
     
    Flash Gordon, Oct 28, 2005
    #20
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Steven

    while loop in a while loop

    Steven, Mar 24, 2005, in forum: Java
    Replies:
    5
    Views:
    2,241
    Tim Slattery
    Mar 30, 2005
  2. Chatralias
    Replies:
    0
    Views:
    385
    Chatralias
    Jul 20, 2003
  3. Raymond Arthur St. Marie II of III

    Re: Stopping a loop with user input. in curses

    Raymond Arthur St. Marie II of III, Jul 20, 2003, in forum: Python
    Replies:
    2
    Views:
    476
  4. Raymond Arthur St. Marie II of III

    Re: Stopping a loop with user input. in curses

    Raymond Arthur St. Marie II of III, Jul 22, 2003, in forum: Python
    Replies:
    1
    Views:
    324
  5. Isaac Won
    Replies:
    9
    Views:
    387
    Ulrich Eckhardt
    Mar 4, 2013
Loading...

Share This Page