【发布时间】:2018-04-23 12:13:12
【问题描述】:
所以我想了解信号量是如何使用分叉的。我编写了一个 C 程序,它分叉一次并通过管道将整数从子 pid 传递到父 pid 4 次。因此,我已经能够通过分叉子项之间的管道成功地读/写。但是,当我尝试将多个写入循环到我的管道时遇到了问题。我正在尝试使用信号量来调节我的管道,以获得交替的写入、读取、写入、读取等功能。我的带有信号量的代码现在会生成 SEGFAULTS,或者在打印出我的标题后就挂起。我知道我可以用另一个管道来完成这项规定,但我专门这样做是为了更好地理解信号量。我一直在读一本操作系统的书,但它并没有真正点击;谁能通过我的代码示例向我解释这一点? (这不是作业)
/*****PROTOTYPES*****/
int SpawnBots();
void sender(int fd[2], sem_t *sem);
void receiver(int fd[2], sem_t *sem);
int exp(int base, int exponent);
int main(int argc, char *argv[]) {
printf("WELCOME...\n");
SpawnBots();
return 0;
}
int SpawnBots() {
sem_t *sem = sem_open("test_semaphore", O_CREAT | O_EXCL, 1, 1);
sem_unlink("test_semaphore");
int fd[2]; //0=input 1=output
pid_t pid;
//sem_init(sem, 1, 1);
pipe(fd);
pid = fork();
if(pid==0) {
//pid=0 is child
sender(fd, sem);
} else {
//pid!=0 is parent
receiver(fd, sem);
}
return 0;
}
void sender(int fd[2], sem_t *sem) {
//child closes read pipe
fflush(stdout);
close(fd[0]);
int val;
char buffer[32];
//writes 4 numbers to stdout
for(int i=1; i<=4; i++) {
sem_wait(sem); //takes control; waits for read from receiver()
val = exp((i+3), i);
printf("\tChild %d: \t%d\n", i, val); //prints out current data its writing
sprintf(buffer, "%d", val);
write(fd[1], buffer, strlen(buffer) + 1); //writes to stdout
sem_post(sem); //hands back control
}
close(fd[1]);
sem_close(sem);
exit(0);
}
void receiver(int fd[2], sem_t *sem) {
//child closes write pipe
//fflush(stdout);
close(fd[1]);
int val;
int i=1;
int nbytes=1;
char buffer[32];
//reads in numbers until stdout is empty
while(1) {
sem_wait(sem); //takes control; waits for write from sender()
if((nbytes = read(fd[0], buffer, sizeof(buffer)+1)) > 0) { //reads from stdout
val = atoi(buffer);
printf("\tParent %d: \t%d\n", i, val); //prints out current data its reading
i++;
} else {
break;
}
sem_post(sem); //hands back control
}
sem_post(sem);
close(fd[0]);
sem_close(sem);
exit(0);
}
int exp(int base, int exponent) {
int output = 1;
for(int i=1; i<=exponent; i++) {
output = output * base;
}
return output;
}
【问题讨论】:
标签: c linux pipe fork semaphore