我不得不说,出于某种原因,在我的笔记本电脑上,它无法正常工作,而且在我的好友笔记本电脑上它正在工作。相同的代码!!我不知道为什么会这样。
当我在第一个while循环中添加一个body并放入printf(“1”)时;在里面。这是工作,pid1从FIFO中读取pid。
服务器的代码:
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
void main()
{
int fd,shmid;
key_t shmkey;
void *shm_add;
pid_t pid,pid1=0,pid2=0;
mkfifo("fifo_clientTOserver",400);
fd=open("fifo_clientTOserver",O_NONBLOCK | O_RDONLY);
pid=fork();
if(pid==0)
{
while(read(fd,&pid1,sizeof(pid_t))==0); //(1)
}
else
{
wait();
while(read(fd,&pid2,sizeof(pid_t))==0)
{
if(pid2!=pid1)
break;
}
remove("fifo_clientTOserver");
}
printf("\nfirst pid= %d\nsecond pid= %d\n",pid1,pid2);
}
客户代码:
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <stdbool.h>
void my_handler(int signum);
bool over=false;
int board[3][3]={{0,0,0},{0,0,0},{0,0,0}};
char tav;
static bool first=false;
void main()
{
int fd;
pid_t pid1=getpid();
signal(SIGUSR2, my_handler);
fd=open("fifo_clientTOserver",O_WRONLY);
write(fd,&pid1,sizeof(pid_t));
printf("%d\n",pid1);
while(!over);
}
void my_handler(int signum)
{
char geth;
printf("1");
//Check if the signal is SIGUSR2.
if (signum == SIGUSR2)
{
if(!first)
{
tav='x';
printf("x");
first=true;
}
else
{
tav='c';
printf("c");
}
}
}
这真的很奇怪,我不知道如何处理它!
当我将第(1)行更改为while(read(fd,&pid1,sizeof(pid_t))==0){printf("1");}
时
它工作正常,pid1
获得价值。
请帮帮我。
答案 0 :(得分:0)
man read
:
如果某个进程打开了管道并且设置了O_NONBLOCK, read()应返回-1并将errno设置为[EAGAIN]。
因此,您的while
循环在没有任何内容的情况下中断。
无论如何,忙碌的等待是不好的。删除O_NONBLOCK或使用
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(fd, &readfds);
select(fd+1, &readfds, NULL, NULL, NULL);
在read()
。
答案 1 :(得分:0)
当您不断检查循环内的某些内容时,非阻塞和其他并行活动会被饿死。通过在检查之间休眠或使用I / O多路复用(选择),可以避免这种繁忙的等待。
while( !AreWeThereYet() ) { GetSomeSleep(); }