How do I create a linux C application with a console that I can connect to remotely
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
add a comment |
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
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 ascreen
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 fromscreen
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. Eithertmux
orscreen
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
add a comment |
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
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
c linux console-application remote-access debian-stretch
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 ascreen
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 fromscreen
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. Eithertmux
orscreen
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
add a comment |
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 ascreen
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 fromscreen
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. Eithertmux
orscreen
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
add a comment |
1 Answer
1
active
oldest
votes
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.
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
add a comment |
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.
add a comment |
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.
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.
edited Nov 22 '18 at 12:09
answered Nov 21 '18 at 5:53
Basile StarynkevitchBasile Starynkevitch
179k13173374
179k13173374
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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 fromscreen
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
orscreen
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