Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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++ 通过popen()执行的命令随机挂起_C++_Linux_Block_Popen_Futex - Fatal编程技术网

C++ 通过popen()执行的命令随机挂起

C++ 通过popen()执行的命令随机挂起,c++,linux,block,popen,futex,C++,Linux,Block,Popen,Futex,我的程序有一个奇怪的问题: 它试图通过管道读取某些命令的输出来查找设备: FILE* fp = NULL; fp = popen ("cd /sys/bus/usb/devices; grep -i NDI */product", "r"); 然后使用fgets读取文件流,并使用pclose关闭管道 在单线程程序中,它运行良好。然而,在我将其集成到多线程程序中后,fgets函数开始随机阻塞线程 检查后,我发现fgets阻塞,因为有时fp作为空文件流返回。在我将fp的状态设置为非阻塞并使用rea

我的程序有一个奇怪的问题:

它试图通过管道读取某些命令的输出来查找设备:

FILE* fp = NULL;
fp = popen ("cd /sys/bus/usb/devices; grep -i NDI */product", "r");
然后使用fgets读取文件流,并使用pclose关闭管道

在单线程程序中,它运行良好。然而,在我将其集成到多线程程序中后,fgets函数开始随机阻塞线程

检查后,我发现fgets阻塞,因为有时fp作为空文件流返回。在我将fp的状态设置为非阻塞并使用read通过其ID读取文件后,我可以看到read返回-1,因为文件流为空,然后pclose挂起。所有这些都是随机发生的

因此,我认为在这种情况下,通过popen执行的命令将挂起,并且永远不会终止。但为什么它是随机发生的呢?多线程程序只有另一个线程用于用户界面交互。我认为这是好的,因为管道只在当地使用

欢迎提出任何意见。谢谢

更新


strace显示,有时子进程在一系列munmap调用之后调用futex,然后挂起:futex0xb72eaf00,futex\u WAIT\u PRIVATE,2,NULL

在正常情况下,futex不会被调用

作为参考,strace在主流程中的输出:

1344962944.530384 pipe2([26, 27], O_CLOEXEC) = 0
1344962944.530441 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb41a8a68) = 25529
1344962944.534683 close(27)             = 0
1344962944.534801 fcntl64(26, F_SETFD, 0) = 0
1344962944.534852 write(1, "entering fgets\n", 15) = 15
1344962944.534924 fstat64(26, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
1344962944.534992 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb377d000
1344962944.535065 read(26, 
子进程shell的strace输出:

1344962944.534652 set_robust_list(0xb41a8a70, 0xc) = 0
1344962944.534790 getpid()              = 25529
1344962944.534843 getppid()             = 25453
1344962944.534917 close(12)             = 0
1344962944.534983 munmap(0xa8fff000, 1048576) = 0
...
1344962944.535925 munmap(0xb2728000, 118784) = 0
1344962944.535952 close(11)             = 0
1344962944.535980 close(10)             = 0
1344962944.536018 futex(0xb72eaf00, FUTEX_WAIT_PRIVATE, 2, NULL

您可以使用strace来查看您的程序及其生成的子程序正在做什么,从系统调用的角度来看。find-L-maxdepth 2-typef-name product | xargs grep-i NDI如何?find将跟踪/sys/bys/usb/devices中的符号链接,对于符号链接,最大深度为2 1,对于符号链接目录中的每个文件,最大深度为1,并查找名为“product”的常规文件。找到的每个“产品”文件都通过管道传输到xargs grep-i NDI。在运行该文件时是否有设备被删除?strace显示,有时子进程在一系列munmap调用后调用futex,然后挂起:futex0xb72eaf00,futex_WAIT_PRIVATE,2,在正常情况下不调用futex。这会是内存泄漏问题吗@Plasmahht无论设备连接与否都会出现问题@Rkysery您可以使用strace查看您的程序及其生成的孩子在做什么,系统调用明智。查找-L-maxdepth 2-type f-name product | xargs grep-i NDI如何?find将跟踪/sys/bys/usb/devices中的符号链接,对于符号链接,最大深度为2 1,对于符号链接目录中的每个文件,最大深度为1,并查找名为“product”的常规文件。找到的每个“产品”文件都通过管道传输到xargs grep-i NDI。在运行该文件时是否有设备被删除?strace显示,有时子进程在一系列munmap调用后调用futex,然后挂起:futex0xb72eaf00,futex_WAIT_PRIVATE,2,在正常情况下不调用futex。这会是内存泄漏问题吗@Plasmaraht无论设备是否连接@rkyser,问题都会出现