#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <iostream>
using namespace std;
void* thread(void* arg)
{
printf("thread created.\n");
int ch;
ch = getc((FILE*)arg);
while (EOF != ch)
{
printf("%c", ch);
ch = getc((FILE*)arg);
}
printf("thread exist.\n");
return (void*)NULL;
}
int main()
{
FILE *pFile = popen("./test", "r");
if (pFile != NULL)
{
pthread_t pid;
pthread_create(&pid, NULL, thread, (void*)pFile);
pclose(pFile);
cout << "pclose returned" << endl;
}
else
{
cout << "popen failed. " << endl;
}
while(1)
{
sleep(100);
}
return 0;
}
test每隔一秒输出一个字符
经测试没有一个字符输出。
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <iostream>
using namespace std;
void* thread(void* arg)
{
printf("thread created.\n");
int ch;
ch = getc((FILE*)arg);
while (EOF != ch)
{
printf("%c", ch);
ch = getc((FILE*)arg);
}
printf("thread exist.\n");
return (void*)NULL;
}
int main()
{
FILE *pFile = popen("./test", "r");
if (pFile != NULL)
{
pthread_t pid;
//pthread_create(&pid, NULL, thread, (void*)pFile);
int ch;
ch = getc(pFile);
while (EOF != ch)
{
printf("%c", ch);
ch = getc(pFile);
}
pclose(pFile);
cout << "pclose returned" << endl;
}
else
{
cout << "popen failed. " << endl;
}
while(1)
{
sleep(100);
}
return 0;
}
此处正确输出了。
结论:pclose在发现管道里有内容时就会立马返回并关闭管道。
因此要想使popen执行完命令,只有在pclose前检查管道文件是否到达EOF。