Здравствуйте!
Разбираюсь с тем, как сделать передачу данных между основным процессом и потомком(потоком). Создаю в процессе pipe, потом создаю потомка (по-идее теперь pipe принадлежит обоим), а так, как он закольцован, то запись в потомке ведёт к появлению данных в родителе, которую я хочу отловить по select.
Внизу пример. Но select не срабатывает почему-то. Просто завершается по таймеру.
Можете подсказать как тут быть?
#include <iostream>
#include <sstream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <resolv.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/syscall.h>
#include <linux/unistd.h>
#include <fcntl.h>
using namespace std;
//Дескрипторы pipa
int client_pipe[2];
//Код потока
void * thr_loop(void * arg)
{
int i = 0;
char wbuf[1024];
while(1)
{
char num[33];
strcpy(wbuf,"test ");
sprintf(num,"%d",++i);
strcat(wbuf,num);
//Пишем в дескриптор для записи раз в секудну
write(client_pipe[1],wbuf,10);
sleep(1);
}
pthread_exit((void * )0);
}
int main(int argc,char*argv[])
{
pipe(client_pipe);
fd_set pipes_set;
FD_ZERO(&pipes_set);
int max_pipe_num = 0;
//Нашли максимальный pipe
if (client_pipe[0] > max_pipe_num) max_pipe_num = client_pipe[0];
if (client_pipe[1] > max_pipe_num) max_pipe_num = client_pipe[1];
//Старт потомка
pthread_t _thread;
pthread_create(&_thread, NULL, thr_loop, NULL);
while(1)
{
struct timeval tv;
const int n = 1024;
char chprbuf[n];
int chprbuf_len = 0;
memset(&chprbuf,0,sizeof(chprbuf));
tv.tv_sec = 1;
tv.tv_usec = 0;
//Ждём данные от потомка
if(select(max_pipe_num + 1, &pipes_set, NULL, NULL, &tv) > 0)
{
chprbuf_len = read(client_pipe[0],chprbuf,n);
if(chprbuf_len>0){
string msg = string(chprbuf);
cout<<msg<<endl;
}
}
}
pthread_join(_thread, NULL);
exit(0);
}