Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

I can send() but I have no way of closing the input channel #21

Closed
mohamedAlaaK opened this issue Dec 30, 2018 · 8 comments
Closed

I can send() but I have no way of closing the input channel #21

mohamedAlaaK opened this issue Dec 30, 2018 · 8 comments

Comments

@mohamedAlaaK
Copy link
Contributor

#include <subprocess.hpp>

using namespace std;
using namespace subprocess;

int main()
{
	vector<Popen> sub_processes;
	for ( int i = 0 ; i < 5 ; i++ )
	{
		sub_processes.emplace_back(Popen({"cat"},input{PIPE}));
		sub_processes[i].send("3 5\n", 5);
	}

	for ( int i = 0 ; i < 5 ; i++ )
	{
		sub_processes[i].wait(); // waits forever
	}
}

In the code above I spawn 5 instances of cat. I call send() to each of them.
In the second loop we call wait but it waits forever. I suspect that cat is still waiting for more input because the channel was not closed.

communicate() does close the channels. But I need to use send() is there a function I am missing that can close the channels?

Thanks in advance.

@mohamedAlaaK
Copy link
Contributor Author

#include <subprocess.hpp>

using namespace std;

using namespace subprocess;

int main()
{
	auto p = Popen({"cat", "-"}, input{PIPE}, output{"cat_fredirect.txt"});
	auto msg = "through stdin to stdout";
	p.send(msg, strlen(msg));
	p.wait();
}

i tried the code in the readme.md and it still waits forever. Haalp!

@mohamedAlaaK
Copy link
Contributor Author

I made detail::Streams stream_ public
and reset() it after send() and it worked!

	for ( int i = 0 ; i < 5 ; i++ )
	{
		sub_processes.emplace_back(Popen({"cat", "-"},input{PIPE}));
		sub_processes[i].send("3 5\n", 5);
		sub_processes[i].stream_.input_.reset();
	}

@arun11299
Copy link
Owner

Hi @mohamedAlaaK

You didn't have to make "stream_" public for this.
You could have instead done:

fclose(sub_processes[i].input());

@mohamedAlaaK
Copy link
Contributor Author

Hi @arun11299
first of all nice profile picture :D
secondly, i used that line instead of resetting the shared ptr and it did crash the program.
after going out of scope the default constructor was called and it tried to delete the shared ptr which was already deleted as a raw ptr using fclose().
is there something i am missing here?

@arun11299
Copy link
Owner

Ah..ofcourse. I will provide an API to fix it. Thanks :)

@mohamedAlaaK
Copy link
Contributor Author

i am looking forward to that. have a nice day

@arun11299
Copy link
Owner

I have added this test.

  void test_cat_send_terminate()
  {
    std::cout << "Test::test_cat_send_terminate" << std::endl;
    std::vector<sp::Popen> pops;

    for (int i=0; i < 5; i++) {
      pops.emplace_back(sp::Popen({"cat", "-"}, sp::input{sp::PIPE}));
      pops[i].send("3 5\n", 5);
      pops[i].close_input();
    }

    for (int i=0; i < 5; i++) {
      pops[i].wait();
    }

    std::cout << "END_TEST" << std::endl;
  }

Let me know if it works for you.

And, Happy new year!!

@mohamedAlaaK
Copy link
Contributor Author

yeah it works greatly thanks for this beautiful project.
Happy new year.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants