我正在编写一个生产者进程来写一个数据块到一个文件,一个消费者进程读取相同的块,但下面的代码卡在一个无限循环中,现在从我身边我认为我有一个消费者流程实施中的问题!!
void wakeup() { ; };
unsigned int sleep ( unsigned int timer )
{
if (sigset(SIGALRM, wakeup)==-1) {
perror("sigset"); return 1;
}
(void)alarm( timer );
(void)pause();
return 0;
}
int main(void) {
int fd, n, i, SomeInt, DataRead;
pid_t pid, ppid;
char buf[4];
char *buf2;
int x=0;
if((fd=open("/tmp/data_file", O_APPEND|O_CREAT, 0640)) <0) exit(1);
sigset(SIGTERM,SIG_IGN);/* signal */ ; sigset(SIGINT,SIG_IGN); /* signal */
pid=fork();
switch (pid) {
case -1: { perror("FORK"); exit(1); } break;
case 0: /* child process - Producer */
sigset(SIGUSR1,wakeup);
sighold(SIGUSR1); /* block / hold signals SIGUSR1 until sigpause*/
FILE *file = fopen ("binary.txt", "r");
while (!feof(file))
{ n = (int)(getpid()%256);
srand((unsigned)n);
sleep(rand() %5);
for( x=0; x<=4;x++)
fscanf (file, "", buf[x]);
write(fd, buf,sizeof(buf));
ppid=getppid();
kill(ppid, SIGUSR2);
sigpause(SIGUSR1);
}
fclose(file);
fflush(stdin);
break;
default: /* -parent code - Consumer */
sigset(SIGUSR2,wakeup);
sighold(SIGUSR2); /* block / hold signals SIGUSR2 until sigpause*/
for (i=0; i<=100; i++) {
/* sleep a random amount of time */
n = (int)(getpid()%256);
srand((unsigned)n);
sleep(rand() %5);
sigpause(SIGUSR2); /* pause(); */
/* reads a character from file */
read(fd, buf,sizeof(buf));
fprintf(stderr,"Consumer PID=%d value=%d\n",getpid(),atoi(buf));
kill(pid, SIGUSR1) ;
}
break;
}
exit(0);
}
答案 0 :(得分:0)
下面的代码陷入无限循环,现在从我身边开始 我认为我在消费者流程实施中遇到了问题
生产者过程中存在一个问题,即您按如下方式编写了无限循环:
while (!feof(file))
{ ...
for (x=0; x<=4; x++)
fscanf(file, "", buf[x]);
...
}
使用空格式字符串,您无法从文件中读取任何内容,因此永远不会到达feof(file)
。
您遇到的其他严重问题包括缩进“样式”(如AShelly提到的)和缺少错误检查(例如fopen()
和write()
)。