C++ 无潜在死锁的完全标准流重定向
如果我想重定向stdin、stdout和stderr,而不存在死锁的风险(例如,子进程可能需要更多stdin上的数据来刷新stdout),那么我是否必须生成多个线程,或者是否有其他解决方案。目前的执行情况:C++ 无潜在死锁的完全标准流重定向,c++,linux,io-redirection,C++,Linux,Io Redirection,如果我想重定向stdin、stdout和stderr,而不存在死锁的风险(例如,子进程可能需要更多stdin上的数据来刷新stdout),那么我是否必须生成多个线程,或者是否有其他解决方案。目前的执行情况: std::thread stderr_proc{read, io_redirector.handle(), stderr, io_redirector.stderr()}; std::thread stdout_proc{read, io_redirector.handle(), stdou
std::thread stderr_proc{read, io_redirector.handle(), stderr, io_redirector.stderr()};
std::thread stdout_proc{read, io_redirector.handle(), stdout, io_redirector.stdout()};
write(io_redirector.handle(), stdin, io_redirector.stdin());
int status;
if(::waitpid(pid, &status, 0) == -1) { abort(); }
stdout_proc.join();
stderr_proc.join();
包括主线程,这个实现在每个流中使用一个线程来避免死锁,但是我认为启动两个新线程是相当沉重的负担。特别是因为它是从许多工作线程中的一个线程调用的,所以最好有一个单线程解决方案。您想将它重定向到哪里?如果在Linux上-可能使用
dup()
<代码>死锁风险(例如,子进程可能需要stdin上的更多数据来刷新stdout您所说的“子进程可能需要stdin上的更多数据来刷新stdout”是什么意思?这怎么会是死锁?难道你不想禁用缓冲吗?最好有一个单线程解决方案。
如果在Linux上-为什么不使用poll
?@KamilCuk死锁,因为父进程在写入时会阻塞(因为管道已满)。但是,是的,可能应该查看poll或epoll,只是为了注意到可能有最多的线程(如果不是全部)您正在寻找的功能。