In c program, how to use Linux tee to redirect the output of itself [duplicate]How can I implement 'tee' programmatically in C?How do I prompt for Yes/No/Cancel input in a Linux shell script?In Linux, how to prevent a background process from being stopped after closing SSH clientHow to redirect output to a file and stdoutHow can I redirect and append both stdout and stderr to a file with Bash?Improve INSERT-per-second performance of SQLite?How to symlink a file in Linux?How do I change permissions for a folder and all of its subfolders and files in one step in Linux?How to change the output color of echo in LinuxPiping command output to tee but also save exit code of commandHow do I find all files containing specific text on Linux?
Review your own paper in Mathematics
Does Doodling or Improvising on the Piano Have Any Benefits?
Giving feedback to someone without sounding prejudiced
Given this phrasing in the lease, when should I pay my rent?
What does "tick" mean in this sentence?
Identifying "long and narrow" polygons in with PostGIS
In One Punch Man, is King actually weak?
Is there a RAID 0 Equivalent for RAM?
Why didn’t Eve recognize the little cockroach as a living organism?
Animation: customize bounce interpolation
Alignment of six matrices
How to preserve electronics (computers, iPads and phones) for hundreds of years
Origin of pigs as a species
Do you waste sorcery points if you try to apply metamagic to a spell from a scroll but fail to cast it?
What's the name of the logical fallacy where a debater extends a statement far beyond the original statement to make it true?
Confusion over Hunter with Crossbow Expert and Giant Killer
What should be the ideal length of sentences in a blog post for ease of reading?
Is there anyway, I can have two passwords for my wi-fi
Isometric embedding of a genus g surface
How do I fix the group tension caused by my character stealing and possibly killing without provocation?
How to test the sharpness of a knife?
Is there a distance limit for minecart tracks?
Echo with obfuscation
Can I run 125khz RF circuit on a breadboard?
In c program, how to use Linux tee to redirect the output of itself [duplicate]
How can I implement 'tee' programmatically in C?How do I prompt for Yes/No/Cancel input in a Linux shell script?In Linux, how to prevent a background process from being stopped after closing SSH clientHow to redirect output to a file and stdoutHow can I redirect and append both stdout and stderr to a file with Bash?Improve INSERT-per-second performance of SQLite?How to symlink a file in Linux?How do I change permissions for a folder and all of its subfolders and files in one step in Linux?How to change the output color of echo in LinuxPiping command output to tee but also save exit code of commandHow do I find all files containing specific text on Linux?
This question already has an answer here:
How can I implement 'tee' programmatically in C?
5 answers
I can't use the Linux command tee at the time the C program gets executed since I can't find which line of the code in a big project precisely that runs this program. I am struggling to come up with a way to call the tee command inside the C program to redirect its printf statement to a log file also. The problem is that I can't call tee without an executable like "./exe | tee some.log" since the program is already executed. I did some research on how to get the stdout of a running process and saw some answers suggesting to check out /proc//fd/1. But I don't know why "1"(stdout) file is empty, and I was expecting the file should store the printf output of the process.
Sincerely appreciate for any help!
c linux tee
marked as duplicate by jww, Community♦ Mar 8 at 15:05
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
|
show 4 more comments
This question already has an answer here:
How can I implement 'tee' programmatically in C?
5 answers
I can't use the Linux command tee at the time the C program gets executed since I can't find which line of the code in a big project precisely that runs this program. I am struggling to come up with a way to call the tee command inside the C program to redirect its printf statement to a log file also. The problem is that I can't call tee without an executable like "./exe | tee some.log" since the program is already executed. I did some research on how to get the stdout of a running process and saw some answers suggesting to check out /proc//fd/1. But I don't know why "1"(stdout) file is empty, and I was expecting the file should store the printf output of the process.
Sincerely appreciate for any help!
c linux tee
marked as duplicate by jww, Community♦ Mar 8 at 15:05
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
Using command-line tools within C programs is sort of missing the point of C. There's easy ways to write a logging function that outputs to one or more filehandles, like stdout and/or a file.
– tadman
Mar 7 at 21:54
1
..since the program is already executed. - what? Then how do you intend to "call"teefrom within the program which is already executed?
– Eugene Sh.
Mar 7 at 21:54
@EugeneSh. You can call tee using the system().
– Ian Huang
Mar 7 at 22:01
@tadman If I understand correctly, are you suggesting to for example customize a my_printf()? If so, it wouldn't work for me since then I will need to change every printf in the project, and it is just undoable...
– Ian Huang
Mar 7 at 22:04
EugeneSh is saying that if the program is already running, then making changes to it won't affect the running process; you'd need to recompile and start the process again. And if you're restarting it anyway, you can just pipe it to tee instead of modifying the source.
– Ray
Mar 7 at 22:10
|
show 4 more comments
This question already has an answer here:
How can I implement 'tee' programmatically in C?
5 answers
I can't use the Linux command tee at the time the C program gets executed since I can't find which line of the code in a big project precisely that runs this program. I am struggling to come up with a way to call the tee command inside the C program to redirect its printf statement to a log file also. The problem is that I can't call tee without an executable like "./exe | tee some.log" since the program is already executed. I did some research on how to get the stdout of a running process and saw some answers suggesting to check out /proc//fd/1. But I don't know why "1"(stdout) file is empty, and I was expecting the file should store the printf output of the process.
Sincerely appreciate for any help!
c linux tee
This question already has an answer here:
How can I implement 'tee' programmatically in C?
5 answers
I can't use the Linux command tee at the time the C program gets executed since I can't find which line of the code in a big project precisely that runs this program. I am struggling to come up with a way to call the tee command inside the C program to redirect its printf statement to a log file also. The problem is that I can't call tee without an executable like "./exe | tee some.log" since the program is already executed. I did some research on how to get the stdout of a running process and saw some answers suggesting to check out /proc//fd/1. But I don't know why "1"(stdout) file is empty, and I was expecting the file should store the printf output of the process.
Sincerely appreciate for any help!
This question already has an answer here:
How can I implement 'tee' programmatically in C?
5 answers
c linux tee
c linux tee
asked Mar 7 at 21:51
Ian HuangIan Huang
32
32
marked as duplicate by jww, Community♦ Mar 8 at 15:05
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
marked as duplicate by jww, Community♦ Mar 8 at 15:05
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
Using command-line tools within C programs is sort of missing the point of C. There's easy ways to write a logging function that outputs to one or more filehandles, like stdout and/or a file.
– tadman
Mar 7 at 21:54
1
..since the program is already executed. - what? Then how do you intend to "call"teefrom within the program which is already executed?
– Eugene Sh.
Mar 7 at 21:54
@EugeneSh. You can call tee using the system().
– Ian Huang
Mar 7 at 22:01
@tadman If I understand correctly, are you suggesting to for example customize a my_printf()? If so, it wouldn't work for me since then I will need to change every printf in the project, and it is just undoable...
– Ian Huang
Mar 7 at 22:04
EugeneSh is saying that if the program is already running, then making changes to it won't affect the running process; you'd need to recompile and start the process again. And if you're restarting it anyway, you can just pipe it to tee instead of modifying the source.
– Ray
Mar 7 at 22:10
|
show 4 more comments
Using command-line tools within C programs is sort of missing the point of C. There's easy ways to write a logging function that outputs to one or more filehandles, like stdout and/or a file.
– tadman
Mar 7 at 21:54
1
..since the program is already executed. - what? Then how do you intend to "call"teefrom within the program which is already executed?
– Eugene Sh.
Mar 7 at 21:54
@EugeneSh. You can call tee using the system().
– Ian Huang
Mar 7 at 22:01
@tadman If I understand correctly, are you suggesting to for example customize a my_printf()? If so, it wouldn't work for me since then I will need to change every printf in the project, and it is just undoable...
– Ian Huang
Mar 7 at 22:04
EugeneSh is saying that if the program is already running, then making changes to it won't affect the running process; you'd need to recompile and start the process again. And if you're restarting it anyway, you can just pipe it to tee instead of modifying the source.
– Ray
Mar 7 at 22:10
Using command-line tools within C programs is sort of missing the point of C. There's easy ways to write a logging function that outputs to one or more filehandles, like stdout and/or a file.
– tadman
Mar 7 at 21:54
Using command-line tools within C programs is sort of missing the point of C. There's easy ways to write a logging function that outputs to one or more filehandles, like stdout and/or a file.
– tadman
Mar 7 at 21:54
1
1
..since the program is already executed. - what? Then how do you intend to "call"
tee from within the program which is already executed?– Eugene Sh.
Mar 7 at 21:54
..since the program is already executed. - what? Then how do you intend to "call"
tee from within the program which is already executed?– Eugene Sh.
Mar 7 at 21:54
@EugeneSh. You can call tee using the system().
– Ian Huang
Mar 7 at 22:01
@EugeneSh. You can call tee using the system().
– Ian Huang
Mar 7 at 22:01
@tadman If I understand correctly, are you suggesting to for example customize a my_printf()? If so, it wouldn't work for me since then I will need to change every printf in the project, and it is just undoable...
– Ian Huang
Mar 7 at 22:04
@tadman If I understand correctly, are you suggesting to for example customize a my_printf()? If so, it wouldn't work for me since then I will need to change every printf in the project, and it is just undoable...
– Ian Huang
Mar 7 at 22:04
EugeneSh is saying that if the program is already running, then making changes to it won't affect the running process; you'd need to recompile and start the process again. And if you're restarting it anyway, you can just pipe it to tee instead of modifying the source.
– Ray
Mar 7 at 22:10
EugeneSh is saying that if the program is already running, then making changes to it won't affect the running process; you'd need to recompile and start the process again. And if you're restarting it anyway, you can just pipe it to tee instead of modifying the source.
– Ray
Mar 7 at 22:10
|
show 4 more comments
1 Answer
1
active
oldest
votes
A shell sets up a pipeline using pipe and dup2 before invoking the program. There's no reason why you couldn't do it after:
void pipeto(char** cmd)
int fds[2];
pipe(fds);
if(fork())
// Set up stdout as the write end of the pipe
dup2(fds[1], 1);
close(fds[0]);
close(fds[1]);
else
// Double fork to not be a direct child
if(fork()) exit(0);
// Set up stdin as the read end of the pipe, and run tee
dup2(fds[0], 0);
close(fds[0]);
close(fds[1]);
execvp(cmd[0], cmd);
int main()
char* cmd[] = "tee", "myfile.txt", NULL ;
pipeto(cmd);
printf("This is a testn");
Result:
$ ./foo
This is a test
$ cat myfile.txt
This is a test
Note that since the shell is no longer aware that there's a tee being piped to, it will not wait for it. This means that output can get a bit jumbled if the program exits and the shell redraws the prompt before tee has finished writing. Output like this is purely a cosmetic problem:
user@host $ ./foo
user@host $ This is a test
It does not mean that the command is hanging, the prompt still works and you can type commands or just hit Enter to redraw.
This seems like exactly what I am looking for, thank you! But please allow me some time to take a look at it, and I will come back and accept it at latest tomorrow! Anyway, thank you again for your answer!
– Ian Huang
Mar 7 at 22:25
You can avoid the premature exiting problem by having the program wait for the child before it exits...
– Chris Dodd
Mar 8 at 0:25
@ChrisDodd Yes, though that assumes having an extra child does not interfere with the program. I conservatively assumed it would and double-forked
– that other guy
Mar 8 at 3:17
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
A shell sets up a pipeline using pipe and dup2 before invoking the program. There's no reason why you couldn't do it after:
void pipeto(char** cmd)
int fds[2];
pipe(fds);
if(fork())
// Set up stdout as the write end of the pipe
dup2(fds[1], 1);
close(fds[0]);
close(fds[1]);
else
// Double fork to not be a direct child
if(fork()) exit(0);
// Set up stdin as the read end of the pipe, and run tee
dup2(fds[0], 0);
close(fds[0]);
close(fds[1]);
execvp(cmd[0], cmd);
int main()
char* cmd[] = "tee", "myfile.txt", NULL ;
pipeto(cmd);
printf("This is a testn");
Result:
$ ./foo
This is a test
$ cat myfile.txt
This is a test
Note that since the shell is no longer aware that there's a tee being piped to, it will not wait for it. This means that output can get a bit jumbled if the program exits and the shell redraws the prompt before tee has finished writing. Output like this is purely a cosmetic problem:
user@host $ ./foo
user@host $ This is a test
It does not mean that the command is hanging, the prompt still works and you can type commands or just hit Enter to redraw.
This seems like exactly what I am looking for, thank you! But please allow me some time to take a look at it, and I will come back and accept it at latest tomorrow! Anyway, thank you again for your answer!
– Ian Huang
Mar 7 at 22:25
You can avoid the premature exiting problem by having the program wait for the child before it exits...
– Chris Dodd
Mar 8 at 0:25
@ChrisDodd Yes, though that assumes having an extra child does not interfere with the program. I conservatively assumed it would and double-forked
– that other guy
Mar 8 at 3:17
add a comment |
A shell sets up a pipeline using pipe and dup2 before invoking the program. There's no reason why you couldn't do it after:
void pipeto(char** cmd)
int fds[2];
pipe(fds);
if(fork())
// Set up stdout as the write end of the pipe
dup2(fds[1], 1);
close(fds[0]);
close(fds[1]);
else
// Double fork to not be a direct child
if(fork()) exit(0);
// Set up stdin as the read end of the pipe, and run tee
dup2(fds[0], 0);
close(fds[0]);
close(fds[1]);
execvp(cmd[0], cmd);
int main()
char* cmd[] = "tee", "myfile.txt", NULL ;
pipeto(cmd);
printf("This is a testn");
Result:
$ ./foo
This is a test
$ cat myfile.txt
This is a test
Note that since the shell is no longer aware that there's a tee being piped to, it will not wait for it. This means that output can get a bit jumbled if the program exits and the shell redraws the prompt before tee has finished writing. Output like this is purely a cosmetic problem:
user@host $ ./foo
user@host $ This is a test
It does not mean that the command is hanging, the prompt still works and you can type commands or just hit Enter to redraw.
This seems like exactly what I am looking for, thank you! But please allow me some time to take a look at it, and I will come back and accept it at latest tomorrow! Anyway, thank you again for your answer!
– Ian Huang
Mar 7 at 22:25
You can avoid the premature exiting problem by having the program wait for the child before it exits...
– Chris Dodd
Mar 8 at 0:25
@ChrisDodd Yes, though that assumes having an extra child does not interfere with the program. I conservatively assumed it would and double-forked
– that other guy
Mar 8 at 3:17
add a comment |
A shell sets up a pipeline using pipe and dup2 before invoking the program. There's no reason why you couldn't do it after:
void pipeto(char** cmd)
int fds[2];
pipe(fds);
if(fork())
// Set up stdout as the write end of the pipe
dup2(fds[1], 1);
close(fds[0]);
close(fds[1]);
else
// Double fork to not be a direct child
if(fork()) exit(0);
// Set up stdin as the read end of the pipe, and run tee
dup2(fds[0], 0);
close(fds[0]);
close(fds[1]);
execvp(cmd[0], cmd);
int main()
char* cmd[] = "tee", "myfile.txt", NULL ;
pipeto(cmd);
printf("This is a testn");
Result:
$ ./foo
This is a test
$ cat myfile.txt
This is a test
Note that since the shell is no longer aware that there's a tee being piped to, it will not wait for it. This means that output can get a bit jumbled if the program exits and the shell redraws the prompt before tee has finished writing. Output like this is purely a cosmetic problem:
user@host $ ./foo
user@host $ This is a test
It does not mean that the command is hanging, the prompt still works and you can type commands or just hit Enter to redraw.
A shell sets up a pipeline using pipe and dup2 before invoking the program. There's no reason why you couldn't do it after:
void pipeto(char** cmd)
int fds[2];
pipe(fds);
if(fork())
// Set up stdout as the write end of the pipe
dup2(fds[1], 1);
close(fds[0]);
close(fds[1]);
else
// Double fork to not be a direct child
if(fork()) exit(0);
// Set up stdin as the read end of the pipe, and run tee
dup2(fds[0], 0);
close(fds[0]);
close(fds[1]);
execvp(cmd[0], cmd);
int main()
char* cmd[] = "tee", "myfile.txt", NULL ;
pipeto(cmd);
printf("This is a testn");
Result:
$ ./foo
This is a test
$ cat myfile.txt
This is a test
Note that since the shell is no longer aware that there's a tee being piped to, it will not wait for it. This means that output can get a bit jumbled if the program exits and the shell redraws the prompt before tee has finished writing. Output like this is purely a cosmetic problem:
user@host $ ./foo
user@host $ This is a test
It does not mean that the command is hanging, the prompt still works and you can type commands or just hit Enter to redraw.
answered Mar 7 at 22:08
that other guythat other guy
74.5k886124
74.5k886124
This seems like exactly what I am looking for, thank you! But please allow me some time to take a look at it, and I will come back and accept it at latest tomorrow! Anyway, thank you again for your answer!
– Ian Huang
Mar 7 at 22:25
You can avoid the premature exiting problem by having the program wait for the child before it exits...
– Chris Dodd
Mar 8 at 0:25
@ChrisDodd Yes, though that assumes having an extra child does not interfere with the program. I conservatively assumed it would and double-forked
– that other guy
Mar 8 at 3:17
add a comment |
This seems like exactly what I am looking for, thank you! But please allow me some time to take a look at it, and I will come back and accept it at latest tomorrow! Anyway, thank you again for your answer!
– Ian Huang
Mar 7 at 22:25
You can avoid the premature exiting problem by having the program wait for the child before it exits...
– Chris Dodd
Mar 8 at 0:25
@ChrisDodd Yes, though that assumes having an extra child does not interfere with the program. I conservatively assumed it would and double-forked
– that other guy
Mar 8 at 3:17
This seems like exactly what I am looking for, thank you! But please allow me some time to take a look at it, and I will come back and accept it at latest tomorrow! Anyway, thank you again for your answer!
– Ian Huang
Mar 7 at 22:25
This seems like exactly what I am looking for, thank you! But please allow me some time to take a look at it, and I will come back and accept it at latest tomorrow! Anyway, thank you again for your answer!
– Ian Huang
Mar 7 at 22:25
You can avoid the premature exiting problem by having the program wait for the child before it exits...
– Chris Dodd
Mar 8 at 0:25
You can avoid the premature exiting problem by having the program wait for the child before it exits...
– Chris Dodd
Mar 8 at 0:25
@ChrisDodd Yes, though that assumes having an extra child does not interfere with the program. I conservatively assumed it would and double-forked
– that other guy
Mar 8 at 3:17
@ChrisDodd Yes, though that assumes having an extra child does not interfere with the program. I conservatively assumed it would and double-forked
– that other guy
Mar 8 at 3:17
add a comment |
Using command-line tools within C programs is sort of missing the point of C. There's easy ways to write a logging function that outputs to one or more filehandles, like stdout and/or a file.
– tadman
Mar 7 at 21:54
1
..since the program is already executed. - what? Then how do you intend to "call"
teefrom within the program which is already executed?– Eugene Sh.
Mar 7 at 21:54
@EugeneSh. You can call tee using the system().
– Ian Huang
Mar 7 at 22:01
@tadman If I understand correctly, are you suggesting to for example customize a my_printf()? If so, it wouldn't work for me since then I will need to change every printf in the project, and it is just undoable...
– Ian Huang
Mar 7 at 22:04
EugeneSh is saying that if the program is already running, then making changes to it won't affect the running process; you'd need to recompile and start the process again. And if you're restarting it anyway, you can just pipe it to tee instead of modifying the source.
– Ray
Mar 7 at 22:10