How do I create a linux C application with a console that I can connect to remotely












2















I have a multi-threaded application written in
C that runs under Debian (Stretch). One of the
threads is a simple console that supports several
commands to control the application. Normally
this application is started automatically when
the system boots and runs in the background with
the console thread disabled.



I am looking for a way to "connect" to the application remotely so that I can use the console.
The connection could either be direct using a
port or I can just ssh to the box and then
connect to the app.



During development I just run the app interactively
but would like the option to debug after it has
already started.



I thought something like netcat might work but it
seems to use TCP/IP ports whereas the console thread just connects to stdin/stdout.



Is there a way to accomplish this?










share|improve this question


















  • 1





    If your program works when you run it from the console interactively, and you don't want to undertake the (significant!) work to add a network text interface, you can start it during boot under a screen process. Screen sets up a virtual terminal I/O environment, and you can connect your real terminal to it and talk to the program running there. When you're done, you can disconnect from screen and the program won't know the difference.

    – Dave M.
    Nov 21 '18 at 6:19











  • Using a virtual terminal seems like the right way to go. Either tmux or screen will serve that purpose.

    – William Pursell
    Nov 22 '18 at 12:15











  • Great ideas. I will look into using one of those. Also, thanks Basile for pointing out some great study topics.

    – VictorV
    Nov 23 '18 at 2:14


















2















I have a multi-threaded application written in
C that runs under Debian (Stretch). One of the
threads is a simple console that supports several
commands to control the application. Normally
this application is started automatically when
the system boots and runs in the background with
the console thread disabled.



I am looking for a way to "connect" to the application remotely so that I can use the console.
The connection could either be direct using a
port or I can just ssh to the box and then
connect to the app.



During development I just run the app interactively
but would like the option to debug after it has
already started.



I thought something like netcat might work but it
seems to use TCP/IP ports whereas the console thread just connects to stdin/stdout.



Is there a way to accomplish this?










share|improve this question


















  • 1





    If your program works when you run it from the console interactively, and you don't want to undertake the (significant!) work to add a network text interface, you can start it during boot under a screen process. Screen sets up a virtual terminal I/O environment, and you can connect your real terminal to it and talk to the program running there. When you're done, you can disconnect from screen and the program won't know the difference.

    – Dave M.
    Nov 21 '18 at 6:19











  • Using a virtual terminal seems like the right way to go. Either tmux or screen will serve that purpose.

    – William Pursell
    Nov 22 '18 at 12:15











  • Great ideas. I will look into using one of those. Also, thanks Basile for pointing out some great study topics.

    – VictorV
    Nov 23 '18 at 2:14
















2












2








2


1






I have a multi-threaded application written in
C that runs under Debian (Stretch). One of the
threads is a simple console that supports several
commands to control the application. Normally
this application is started automatically when
the system boots and runs in the background with
the console thread disabled.



I am looking for a way to "connect" to the application remotely so that I can use the console.
The connection could either be direct using a
port or I can just ssh to the box and then
connect to the app.



During development I just run the app interactively
but would like the option to debug after it has
already started.



I thought something like netcat might work but it
seems to use TCP/IP ports whereas the console thread just connects to stdin/stdout.



Is there a way to accomplish this?










share|improve this question














I have a multi-threaded application written in
C that runs under Debian (Stretch). One of the
threads is a simple console that supports several
commands to control the application. Normally
this application is started automatically when
the system boots and runs in the background with
the console thread disabled.



I am looking for a way to "connect" to the application remotely so that I can use the console.
The connection could either be direct using a
port or I can just ssh to the box and then
connect to the app.



During development I just run the app interactively
but would like the option to debug after it has
already started.



I thought something like netcat might work but it
seems to use TCP/IP ports whereas the console thread just connects to stdin/stdout.



Is there a way to accomplish this?







c linux console-application remote-access debian-stretch






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 21 '18 at 5:48









VictorVVictorV

1112




1112








  • 1





    If your program works when you run it from the console interactively, and you don't want to undertake the (significant!) work to add a network text interface, you can start it during boot under a screen process. Screen sets up a virtual terminal I/O environment, and you can connect your real terminal to it and talk to the program running there. When you're done, you can disconnect from screen and the program won't know the difference.

    – Dave M.
    Nov 21 '18 at 6:19











  • Using a virtual terminal seems like the right way to go. Either tmux or screen will serve that purpose.

    – William Pursell
    Nov 22 '18 at 12:15











  • Great ideas. I will look into using one of those. Also, thanks Basile for pointing out some great study topics.

    – VictorV
    Nov 23 '18 at 2:14
















  • 1





    If your program works when you run it from the console interactively, and you don't want to undertake the (significant!) work to add a network text interface, you can start it during boot under a screen process. Screen sets up a virtual terminal I/O environment, and you can connect your real terminal to it and talk to the program running there. When you're done, you can disconnect from screen and the program won't know the difference.

    – Dave M.
    Nov 21 '18 at 6:19











  • Using a virtual terminal seems like the right way to go. Either tmux or screen will serve that purpose.

    – William Pursell
    Nov 22 '18 at 12:15











  • Great ideas. I will look into using one of those. Also, thanks Basile for pointing out some great study topics.

    – VictorV
    Nov 23 '18 at 2:14










1




1





If your program works when you run it from the console interactively, and you don't want to undertake the (significant!) work to add a network text interface, you can start it during boot under a screen process. Screen sets up a virtual terminal I/O environment, and you can connect your real terminal to it and talk to the program running there. When you're done, you can disconnect from screen and the program won't know the difference.

– Dave M.
Nov 21 '18 at 6:19





If your program works when you run it from the console interactively, and you don't want to undertake the (significant!) work to add a network text interface, you can start it during boot under a screen process. Screen sets up a virtual terminal I/O environment, and you can connect your real terminal to it and talk to the program running there. When you're done, you can disconnect from screen and the program won't know the difference.

– Dave M.
Nov 21 '18 at 6:19













Using a virtual terminal seems like the right way to go. Either tmux or screen will serve that purpose.

– William Pursell
Nov 22 '18 at 12:15





Using a virtual terminal seems like the right way to go. Either tmux or screen will serve that purpose.

– William Pursell
Nov 22 '18 at 12:15













Great ideas. I will look into using one of those. Also, thanks Basile for pointing out some great study topics.

– VictorV
Nov 23 '18 at 2:14







Great ideas. I will look into using one of those. Also, thanks Basile for pointing out some great study topics.

– VictorV
Nov 23 '18 at 2:14














1 Answer
1






active

oldest

votes


















1














Read more about Linux programming, perhaps the old ALP (advanced linux programming) book (freely downloadable), or something newer. See also the syscalls(2) list. You want some inter-process communication.



You need to learn more about sockets. See sockets(7); you might use Unix sockets, see unix(7) (or use fifo(7), pipe(7) etc...), or even TCP/IP sockets, see tcp(7) (but then beware of hostile connections from the Internet). You need to use some multiplexing system call, such as poll(2). In simple cases, your user could just use telnet to connect to your application (beware, there is no encryption involved; so you need to trust the connection, e.g. be on some internal LAN).



You could decide to add some web interface to your program (which then becomes a specialized web server, e.g. serving some http://localhost:12345/ and similar URLs). Then use some HTTP server library, such as libonion or libhttp. Of course that requires familiarity with Web technologies (HTTP, HTML5 & CSS, perhaps JavaScript and AJAX). Then your user would use his/her browser to query the state of (or perhaps interact with) your application, or use some HTTP client command like curl. I recommend that route, but it does require some work and familiarity with Web techniques.



You might also be interested by the libssh library.



You could decide that your application becomes a service, and interface it to systemd.



PS. You should dedicate several days to read stuff before coding.






share|improve this answer

























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53405943%2fhow-do-i-create-a-linux-c-application-with-a-console-that-i-can-connect-to-remot%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    Read more about Linux programming, perhaps the old ALP (advanced linux programming) book (freely downloadable), or something newer. See also the syscalls(2) list. You want some inter-process communication.



    You need to learn more about sockets. See sockets(7); you might use Unix sockets, see unix(7) (or use fifo(7), pipe(7) etc...), or even TCP/IP sockets, see tcp(7) (but then beware of hostile connections from the Internet). You need to use some multiplexing system call, such as poll(2). In simple cases, your user could just use telnet to connect to your application (beware, there is no encryption involved; so you need to trust the connection, e.g. be on some internal LAN).



    You could decide to add some web interface to your program (which then becomes a specialized web server, e.g. serving some http://localhost:12345/ and similar URLs). Then use some HTTP server library, such as libonion or libhttp. Of course that requires familiarity with Web technologies (HTTP, HTML5 & CSS, perhaps JavaScript and AJAX). Then your user would use his/her browser to query the state of (or perhaps interact with) your application, or use some HTTP client command like curl. I recommend that route, but it does require some work and familiarity with Web techniques.



    You might also be interested by the libssh library.



    You could decide that your application becomes a service, and interface it to systemd.



    PS. You should dedicate several days to read stuff before coding.






    share|improve this answer






























      1














      Read more about Linux programming, perhaps the old ALP (advanced linux programming) book (freely downloadable), or something newer. See also the syscalls(2) list. You want some inter-process communication.



      You need to learn more about sockets. See sockets(7); you might use Unix sockets, see unix(7) (or use fifo(7), pipe(7) etc...), or even TCP/IP sockets, see tcp(7) (but then beware of hostile connections from the Internet). You need to use some multiplexing system call, such as poll(2). In simple cases, your user could just use telnet to connect to your application (beware, there is no encryption involved; so you need to trust the connection, e.g. be on some internal LAN).



      You could decide to add some web interface to your program (which then becomes a specialized web server, e.g. serving some http://localhost:12345/ and similar URLs). Then use some HTTP server library, such as libonion or libhttp. Of course that requires familiarity with Web technologies (HTTP, HTML5 & CSS, perhaps JavaScript and AJAX). Then your user would use his/her browser to query the state of (or perhaps interact with) your application, or use some HTTP client command like curl. I recommend that route, but it does require some work and familiarity with Web techniques.



      You might also be interested by the libssh library.



      You could decide that your application becomes a service, and interface it to systemd.



      PS. You should dedicate several days to read stuff before coding.






      share|improve this answer




























        1












        1








        1







        Read more about Linux programming, perhaps the old ALP (advanced linux programming) book (freely downloadable), or something newer. See also the syscalls(2) list. You want some inter-process communication.



        You need to learn more about sockets. See sockets(7); you might use Unix sockets, see unix(7) (or use fifo(7), pipe(7) etc...), or even TCP/IP sockets, see tcp(7) (but then beware of hostile connections from the Internet). You need to use some multiplexing system call, such as poll(2). In simple cases, your user could just use telnet to connect to your application (beware, there is no encryption involved; so you need to trust the connection, e.g. be on some internal LAN).



        You could decide to add some web interface to your program (which then becomes a specialized web server, e.g. serving some http://localhost:12345/ and similar URLs). Then use some HTTP server library, such as libonion or libhttp. Of course that requires familiarity with Web technologies (HTTP, HTML5 & CSS, perhaps JavaScript and AJAX). Then your user would use his/her browser to query the state of (or perhaps interact with) your application, or use some HTTP client command like curl. I recommend that route, but it does require some work and familiarity with Web techniques.



        You might also be interested by the libssh library.



        You could decide that your application becomes a service, and interface it to systemd.



        PS. You should dedicate several days to read stuff before coding.






        share|improve this answer















        Read more about Linux programming, perhaps the old ALP (advanced linux programming) book (freely downloadable), or something newer. See also the syscalls(2) list. You want some inter-process communication.



        You need to learn more about sockets. See sockets(7); you might use Unix sockets, see unix(7) (or use fifo(7), pipe(7) etc...), or even TCP/IP sockets, see tcp(7) (but then beware of hostile connections from the Internet). You need to use some multiplexing system call, such as poll(2). In simple cases, your user could just use telnet to connect to your application (beware, there is no encryption involved; so you need to trust the connection, e.g. be on some internal LAN).



        You could decide to add some web interface to your program (which then becomes a specialized web server, e.g. serving some http://localhost:12345/ and similar URLs). Then use some HTTP server library, such as libonion or libhttp. Of course that requires familiarity with Web technologies (HTTP, HTML5 & CSS, perhaps JavaScript and AJAX). Then your user would use his/her browser to query the state of (or perhaps interact with) your application, or use some HTTP client command like curl. I recommend that route, but it does require some work and familiarity with Web techniques.



        You might also be interested by the libssh library.



        You could decide that your application becomes a service, and interface it to systemd.



        PS. You should dedicate several days to read stuff before coding.







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 22 '18 at 12:09

























        answered Nov 21 '18 at 5:53









        Basile StarynkevitchBasile Starynkevitch

        179k13173374




        179k13173374
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53405943%2fhow-do-i-create-a-linux-c-application-with-a-console-that-i-can-connect-to-remot%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Guess what letter conforming each word

            Port of Spain

            Run scheduled task as local user group (not BUILTIN)