popen pclose测试

来源:互联网 发布:淘宝手机搜索排名规则 编辑:程序博客网 时间:2024/05/16 05:13
 

 

#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。