Код: Выделить всё
#include <iostream>
#include <pthread.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/msg.h>
#include <sys/ipc.h>
struct msgbuff
{
long mtype;
char data;
};
void* thr1_func(void* arg)
{
int fd2 = open("thr2.out", O_CREAT | O_WRONLY, 0660);
printf("fd=%u, err=%s\n",fd2, strerror(errno));
int mq;
if ((mq = msgget(80, IPC_CREAT | IPC_EXCL | 0660)) == -1)
{
if (errno != EEXIST)
{
perror("msgget()");
return (void*)-1;
}
mq = msgget(80, 0);
}
printf("mq2=%u\n", mq);
msgbuff mb = {0, 0};
while (mb.data != '!')
{
int r = msgrcv(mq, &mb, sizeof mb, 81, 0);
//printf("r=%u d=%c, ", r, mb.data);
int a=write(fd2, &mb.data, 1);
printf("fd=%d, ", /*r, mb.data, */fd2);
}
printf("222\n");
printf("fd=%d", fd2);
int r=close(fd2);
printf("r=%d err=%s\n", r, strerror(errno));
return NULL;
}
int main()
{
pthread_t thr1;
pthread_create(&thr1, NULL, thr1_func, NULL);
int mq;
if ((mq = msgget(80, IPC_CREAT | IPC_EXCL | 0660)) == -1)
{
if (errno != EEXIST)
{
perror("msgget()");
return -1;
}
mq = msgget(80, 0);
}
printf("mq1=%u\n", mq);
int fd = open("thr2.cpp", O_RDONLY, 0660);
char c;
struct msgbuff mb;
while (read(fd, &c, 1) != 0)
{
//printf("%c", c);
printf("fd1=%d",fd);
if (c == 'e' || c == 'y' || c == 'u' || c == 'i' || c == 'o' || c == 'a')
{
mb.mtype = 81;
mb.data = c;
msgsnd(mq, &mb, sizeof mb, 0);
}
}
mb.mtype = 81;
mb.data = '!';
msgsnd(mq, &mb, sizeof mb, 0);
pthread_join(thr1, NULL);
printf("111 fd=%d\n", fd);
msgctl(mq, IPC_RMID, NULL);
close(fd);
return 0;
}
теперь main() ждёт завршения треда. почему они не переключались в той проге?
возникла другая проблема: fd2 в треде меняется САМ. вот:
Код: Выделить всё
[user@pluton-linux os]$ ./thr2
mq1=524288
fd1=3fd1=3fd1=3fd1=3 ... fd1=3fd1=3fd1=3fd=5, err=Success
mq2=524288
fd=1777879268, fd=1979205860, fd=1710770404, fd=1777879268, fd=1878542564, fd=1710770404, fd=1643661540, fd=1777879268, fd=1979205860, fd=1710770404, fd=1710770404, fd=1643661540, fd=1777879268, fd=1979205860, fd=1710770404, fd=1777879268, fd=1979205860, fd=1710770404, fd=1710770404, fd=1878542564, fd=1777879268, fd=1979205860, fd=1710770404, fd=2046314724, fd=1777879268, fd=1979205860, fd=1710770404, fd=2046314724, fd=1777879268, fd=1979205860, fd=1979205860, fd=1878542564, fd=2046314724, fd=1710770404, fd=1643661540, fd=1643661540, fd=1643661540, fd=1878542564, fd=1777879268, fd=1979205860, fd=1878542564, fd=1777879268, fd=1643661540, fd=1777879268, fd=1878542564, fd=1710770404, fd=1878542564, fd=1979205860, fd=1777879268, fd=1979205860, fd=1710770404, fd=1710770404, fd=1878542564, fd=1710770404, fd=1878542564, fd=1777879268, fd=1777879268, fd=1710770404, fd=1777879268, fd=1710770404, fd=1878542564, fd=1710770404, fd=1878542564, fd=1710770404, fd=1710770404, fd=1979205860, fd=1878542564, fd=1777879268, fd=1710770404, fd=1777879268, fd=1979205860, fd=1979205860, fd=1777879268, fd=1710770404, fd=1643661540, fd=1643661540, fd=1777879268, fd=1777879268, fd=1710770404, fd=1878542564, fd=1777879268, fd=1979205860, fd=1643661540, fd=1643661540, fd=1777879268, fd=1643661540, fd=1777879268, fd=1710770404, fd=1643661540, fd=1643661540, fd=1777879268, fd=1643661540, fd=1643661540, fd=1777879268, fd=1777879268, fd=1777879268, fd=1878542564, fd=1710770404, fd=1777879268, fd=1710770404, fd=1710770404, fd=1878542564, fd=1710770404, fd=1878542564, fd=1710770404, fd=1979205860, fd=1777879268, fd=1643661540, fd=1777879268, fd=1710770404, fd=1643661540, fd=1710770404, fd=1643661540, fd=1710770404, fd=1643661540, fd=1710770404, fd=1979205860, fd=1777879268, fd=1777879268, fd=1710770404, fd=1777879268, fd=1710770404, fd=1878542564, fd=1710770404, fd=1878542564, fd=1710770404, fd=1710770404, fd=1979205860, fd=1710770404, fd=1777879268, fd=1979205860, fd=1777879268, fd=1878542564, fd=1710770404, fd=1643661540, fd=1979205860, fd=1979205860, fd=1777879268, fd=1710770404, fd=1710770404, fd=1643661540, fd=1777879268, fd=1777879268, fd=1777879268, fd=1710770404, fd=2046314724, fd=1979205860, fd=1777879268, fd=1878542564, fd=1643661540, fd=2046314724, fd=1710770404, fd=1643661540, fd=1643661540, fd=1777879268, fd=1710770404, fd=1878542564, fd=2046314724, fd=1710770404, fd=1643661540, fd=1643661540, fd=1777879268, fd=1710770404, fd=1878542564, fd=1710770404, fd=1643661540, fd=1878542564, fd=1777879268, fd=1777879268, fd=1878542564, fd=1710770404, fd=1710770404, fd=1979205860, fd=184043748, 222
fd=184043748r=-1 err=Bad file descriptor
111 fd=3