Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Write data to stdin of an executable file in the shell script

I’m working on a project where I’m trying to build some basic functionality. I’m running simple c code, which reads the data from the stdin file stream and prints. The short snippet of the code is attached below. In my application, I want to start a c code which reads the data through stdin and performs some operation on it, and there will be another process running which sends the data to stdin periodically. Check the pseudo shell script for a better understanding. As I’m a beginner with shell scripting, I don’t know how to achieve this task. So, please help me if anyone has done something similar or has clues on how to do it.

#!/bin/sh
#I know this won't work because running code and cat command are referring to a different file stream
clear # clearing the screen
echo "running the shell command" #basic eco in the beginning
./a.out & # Run the compiled c code in the background 
while true 
  do
    sleep 2 #2-sec delay
    cat <<< "# check $\n" # send the data to the stdin
  done
exit 0

.

//regular c file, command: cc filename.c 
#include <stdio.h>
#include <unistd.h>
int FnReceiveCharacter(void)
{      
   unsigned char c = 0, d;
   d = read(STDIN_FILENO, &c, 1);
   fflush(stdin);   
   return c;
}
int main( )
{
  while(1) printf("%c",FnReceiveCharacter( ));
}

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

Best I can tell all you need is:

a.out < <(
    while true; do
        sleep 2
        echo '# check'
    done
)

For example, using a shell function calling awk instead of your C code which I can’t compile:

$ cat tst.sh
#!/usr/bin/env bash

foo() {
    awk '{ print "Received line", $0 }' "${@:--}"
}

foo < <(
    while true; do
        sleep 2
        echo '# check'
    done
)

$ ./tst.sh
Received line # check
Received line # check
...

See the bottom of the "Input source selection" section in https://mywiki.wooledge.org/BashFAQ/001 for why I’m using that < <(...) redirection from process substitution construct instead of a pipe.

Now that you updated your code to be compilable I did test it:

$ cat tst.sh
#!/usr/bin/env bash

./a.out < <(
    while true; do
        sleep 2
        echo '# check'
    done
)

$ ./tst.sh
# check
# check
# check
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading