被调用代码:sum.cpp
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main(int argc,char*argv[])
{
int a = 2;
int b = 3;
printf("==sum is %d\n", a + b);
return a + b;
}
g++ -o sum sum.cpp
调用代码:popen.cpp
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main(int argc,char*argv[])
{
FILE *fstream = NULL;
char buff[1024];
memset(buff, 0, sizeof(buff));
if(NULL == (fstream = popen("./sum","r")))
{
fprintf(stderr,"execute command failed: %s",strerror(errno));
return -1;
}
while(NULL != fgets(buff, sizeof(buff), fstream))
{
printf("popen fgets %s",buff);
}
pclose(fstream);
return 0;
}
g++ -o popen popen.cpp
结果:
root@7f4dc6e8ef5e:/test# ./popen
popen fgets ==sum is 5
进一步,多线程+多进程
sum.cpp
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char*argv[])
{
int a = 2;
int b = 3;
if(argc < 1)
{
return -1;
}
int sleep_time = atoi(argv[1]);
printf("sleep %d\n",sleep_time);
sleep(sleep_time);
printf("==sum is %d\n", a + b);
return a + b;
}
g++ -o sum sum.cpp
popen.cpp
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <string>
#include <iostream>
#include <thread>
#include <pthread.h>
using namespace std;
#define NUM_THREADS 2
void* work(void* sleep_time)
{
char *c = new char;
sprintf(c,"%d",sleep_time);
std::string str = std::string(c);
str = "./sum " + str;
FILE *fstream = NULL;
char buff[1024];
memset(buff, 0, sizeof(buff));
if(NULL == (fstream = popen(str.c_str(),"r")))
{
fprintf(stderr,"execute command failed: %s",strerror(errno));
return 0;
}
while(NULL != fgets(buff, sizeof(buff), fstream))
{
printf("popen fgets %s",buff);
}
pclose(fstream);
return 0;
}
int main(int argc,char*argv[])
{
int a = 6;
pthread_t tids[NUM_THREADS];
for(int i = 0; i < NUM_THREADS; ++i)
{
int b = a-i*2;
printf("begin %d\n",b);
int ret = pthread_create(&tids[i], NULL, work, (void*)b);
printf("end %d\n",b);
if (ret != 0)
{
cout << "pthread_create error: error_code=" << ret << endl;
}
}
pthread_exit(NULL);
return 0;
}
g++ -o popen popen.cpp -lpthread
运行结果:
root@7f4dc6e8ef5e:/test# ./popen
begin 6
end 6
begin 4
end 4
popen fgets sleep 4
popen fgets ==sum is 5
popen fgets sleep 6
popen fgets ==sum is 5