Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无潜在死锁的完全标准流重定向_C++_Linux_Io Redirection - Fatal编程技术网

C++ 无潜在死锁的完全标准流重定向

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

如果我想重定向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(), 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,只是为了注意到可能有最多的线程(如果不是全部)您正在寻找的功能。