Почему мои семафоры не работают должным образом? - PullRequest
0 голосов
/ 20 апреля 2019

Мне нужно вывести следующее предложение на консоль «Меня зовут Бонд, Джеймс Бонд», чередуя слова с помощью семафоров.

Всякий раз, когда я печатаю слова, используя разрывы строк «\ 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?

1 Ответ

1 голос
/ 20 апреля 2019

Почему мой вывод корректен, только если я добавляю разрыв строки в каждом printf?

printf () в основном по умолчанию буферизуется.Функции stdio, которые используют потоки (вместо файловых дескрипторов, как в write ()), используют буфер.

Буфер может быть установлен через setvbuf (3).

См. также Отключить буферизациюдля стандартного ввода и вывода с помощью setvbuf ()

...