今天遇到一个问题:
程序阻塞住了,父进程A会调用popen执行shell命令并读取结果,现在在系统中存在两个A进程,其中一个是另一个的子进程,我在A调用popen前后打印日志,从日志看popen没有执行结束,阻塞在popen里面了,父进程处于Sleeping状态,子进程处于Running状态,其他完全一样,所以我怀疑是父程序A调用的popen函数,子进程A在fork和exec之间被阻塞了,导致目前这个情况,这个是我目前的猜测,没有方法验证,只有这么解释的通,有朋友遇到过这个情况的吗?
在线求助。
这么诡异,你popen怎么写的,看看
printf("\nwaiting...(thread id : %ld)\n", pthread_self());
pthread_mutex_lock(&mutex);
printf("\nenter.(thread id : %ld)\n", pthread_self());
FILE *cmd_fd = popen(cmd_str, "r");
if (cmd_fd) {
printf("\ncmd running....\n");
}
printf("\nexit.(thread id : %ld)\n", pthread_self());
pthread_mutex_unlock(&mutex);
@atomic_weapon:
popen将cmd_str命令的标准输出dup到管道,需要标准I/O来读取命令打印的信息,结束了之后用pclose关闭,而不是用fclose关闭。