为什么我的信号量没有按预期工作?
Why are my semaphores not working as expected?
我需要将以下句子打印到控制台"My name is Bond, James Bond" 使用信号量交替单词。
每当我使用换行符“\n”打印单词时,所有内容都会按预期顺序打印,但是如果我不使用换行符,所有内容都会乱序打印。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <wait.h>
#include <unistd.h>
#include <semaphore.h>
#include <string.h>
int main(){
pid_t pid;
int i = 0;
sem_t *sem[4];
char * names[4] = {"/sem_ex07_1", "/sem_ex07_2", "/sem_ex07_3", "/sem_ex07_4"};
for(i = 0; i < 4; i++){
sem_unlink(names[i]);
}
for(i = 0; i < 4; i++){
if((sem[i] = sem_open(names[i], O_CREAT | O_EXCL, 0644, 0)) == SEM_FAILED){
printf("sem_open() error\n");
sem_unlink(names[i]);
exit(1);
}
}
sem_post(sem[0]);
for(i = 0; i < 3; i++){
pid = fork();
if(pid == 0){
break;
}
}
if(pid == 0){
if(i == 0){
sem_wait(sem[0]);
printf("My");
sem_post(sem[1]);
sem_wait(sem[0]);
printf("Bond, ");
sem_post(sem[1]);
} else if(i == 1){
sem_wait(sem[1]);
printf("name ");
sem_post(sem[2]);
sem_wait(sem[1]);
printf("James ");
sem_post(sem[2]);
} else if(i == 2){
sem_wait(sem[2]);
printf("is ");
sem_post(sem[0]);
sem_wait(sem[2]);
printf("Bond.\n");
sem_post(sem[3]);
}
} else if(pid > 0){
sem_wait(sem[3]);
for(i = 0; i < 4; i++){
sem_unlink(names[i]);
}
}
return 0;
}
为什么我的输出只有在每个 printf
上添加换行符时才正确?
Why is my output only correct if I add a line break on each printf?
printf() 默认情况下主要是行缓冲。使用流的 stdio 函数(而不是像 write() 那样的文件描述符)使用缓冲区。
可以通过 setvbuf(3) 设置缓冲区。
另见 Disable buffering for stdin and stdout using setvbuf()
我需要将以下句子打印到控制台"My name is Bond, James Bond" 使用信号量交替单词。
每当我使用换行符“\n”打印单词时,所有内容都会按预期顺序打印,但是如果我不使用换行符,所有内容都会乱序打印。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <wait.h>
#include <unistd.h>
#include <semaphore.h>
#include <string.h>
int main(){
pid_t pid;
int i = 0;
sem_t *sem[4];
char * names[4] = {"/sem_ex07_1", "/sem_ex07_2", "/sem_ex07_3", "/sem_ex07_4"};
for(i = 0; i < 4; i++){
sem_unlink(names[i]);
}
for(i = 0; i < 4; i++){
if((sem[i] = sem_open(names[i], O_CREAT | O_EXCL, 0644, 0)) == SEM_FAILED){
printf("sem_open() error\n");
sem_unlink(names[i]);
exit(1);
}
}
sem_post(sem[0]);
for(i = 0; i < 3; i++){
pid = fork();
if(pid == 0){
break;
}
}
if(pid == 0){
if(i == 0){
sem_wait(sem[0]);
printf("My");
sem_post(sem[1]);
sem_wait(sem[0]);
printf("Bond, ");
sem_post(sem[1]);
} else if(i == 1){
sem_wait(sem[1]);
printf("name ");
sem_post(sem[2]);
sem_wait(sem[1]);
printf("James ");
sem_post(sem[2]);
} else if(i == 2){
sem_wait(sem[2]);
printf("is ");
sem_post(sem[0]);
sem_wait(sem[2]);
printf("Bond.\n");
sem_post(sem[3]);
}
} else if(pid > 0){
sem_wait(sem[3]);
for(i = 0; i < 4; i++){
sem_unlink(names[i]);
}
}
return 0;
}
为什么我的输出只有在每个 printf
上添加换行符时才正确?
Why is my output only correct if I add a line break on each printf?
printf() 默认情况下主要是行缓冲。使用流的 stdio 函数(而不是像 write() 那样的文件描述符)使用缓冲区。
可以通过 setvbuf(3) 设置缓冲区。
另见 Disable buffering for stdin and stdout using setvbuf()