作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个生产者进程来将数据 block 写入文件,以及一个消费者进程来读取同一 block ,但是下面的代码陷入了无限循环,现在从我的角度来看,我认为我有一个消费者进程实现中的问题!!
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);
}
最佳答案
the below code gets stuck in an infinite loop, now from my side i think i am having a problem in the consumer process implementation
一个问题出现在生产者进程中,您在其中编写了一个无限循环,如下所示:
while (!feof(file))
{ ...
for (x=0; x<=4; x++)
fscanf(file, "", buf[x]);
...
}
使用空格式字符串,您无法从文件中读取任何内容,因此永远不会到达 feof(file)
。
您遇到的其他严重问题包括缩进“风格”(如 AShelly 提到的)和缺乏错误检查(例如 fopen()
和 write()
)。
关于c - 使用 sigusr1 和 sigusr2 进行进程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20336374/
我是一名优秀的程序员,十分优秀!