gpt4 book ai didi

c - 为什么我的信号量没有按预期工作?

转载 作者:行者123 更新时间:2023-11-30 14:39:59 25 4
gpt4 key购买 nike

我需要将以下句子打印到控制台“我的名字是邦德,詹姆斯邦德”,并使用信号量交替单词。

每当我使用换行符“\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() 默认情况下大多是行缓冲的。使用流(而不是像 write() 那样的文件描述符)的 stdio 函数使用缓冲区。

可以通过setvbuf(3)设置缓冲区。

另请参阅Disable buffering for stdin and stdout using setvbuf()

关于c - 为什么我的信号量没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55775595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com