【发布时间】:2014-03-12 00:57:19
【问题描述】:
我有一个程序应该让两个进程交替执行某项任务。在子进程第五次执行其任务后,它必须销毁一个信号量,并且父进程应该因此而停止。
一开始这听起来很简单,但我很难捕捉到sem_wait() 函数的返回值。
这是我的文件:
#include "Part2Defs.h"
int main() {
FILE *fptr = 0;
sem_t *child = mmap(0, sizeof(sem_t), PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS, -1, 0);
sem_t *parent = mmap(0, sizeof(sem_t), PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS, -1, 0);
/* save the number that we'll be writing to the file */
int number = 1, removed = 0;
sem_init(child, 1, 1);
sem_init(parent, 1, 0);
fptr = fopen(BUFFER, "r+");
if(fptr == 0) {
printf("An error occurred while opening the file\n");
}
fprintf(fptr, "%d", number);
fclose(fptr);
int pID = fork();
if(pID == 0) {
/* do this FOREVER. */
while(1) {
/* I was hoping to get the return value here */
if(sem_wait(parent) == 0) {
/* open the file */
fptr = fopen(BUFFER, "r+");
printf("B. The number [] was modified by parent\n");
fclose(fptr);
sem_post(child);
}
else {
printf("--parent-- waiting for new number to be READ: Identifier removed");
}
}
return 0;
}
else if(pID > 0) {
/* make a counter to go from 0 to 5 */
int i = 0;
while(1) {
sem_wait(child);
if(i++ == 5) {
/* delete the semaphore */
sem_destroy(parent);
printf("Semaphore removed\n");
break;
}
/* open the file */
fptr = fopen(BUFFER, "r+");
printf("A. The number [] was modified by child\n");
fclose(fptr);
sem_post(parent);
}
return 0;
}
else {
printf("There was an error creating the fork.\n");
exit(1);
}
}
这是我的输出:
A. The number [] was modified by child
B. The number [] was modified by parent
A. The number [] was modified by child
B. The number [] was modified by parent
A. The number [] was modified by child
B. The number [] was modified by parent
A. The number [] was modified by child
B. The number [] was modified by parent
A. The number [] was modified by child
B. The number [] was modified by parent
Semaphore removed
这几乎正是我所希望的,除了父进程从未以包含错误的消息结束。
顺便说一句:这是作业,但由于我缺乏声誉,据说我不允许在自己的帖子上添加作业标签。
【问题讨论】:
-
为什么对我的问题投反对票?我无法在任何地方找到这个问题,我认为问这个问题是完全合理的......