У меня есть 3 процесса, я хочу синхронизировать, используя системный семафор.
Процесс 1,2,3 запишет данные в один файл.
Процесс 1, запись от А до Я,
Процесс 2 записать в я,
Процесс 3 записать с 1 по 9.
Вывод, который я ожидаю Aa1Bb2Cc3Dd4Ee5Ff6Gg7Hh8Ii9.
Процесс 1
#include<sys/types.h>
#include<sys/sem.h>
#include<sys/ipc.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
int main()
{
int id,ret,fd;
char i;
struct sembuf v;
id=semget(8, 5, IPC_CREAT | 0644);
if(id <0)
{
printf("wrong\n");
}
fd= open("sample1", O_RDWR | O_APPEND | O_CREAT,0644);
v.sem_num = 1;
v.sem_op = 0;
v.sem_flg = 0;
semctl(id, 1, SETVAL, 0);
semctl(id, 2, SETVAL, 0);
semctl(id, 3, SETVAL, 0);
for(i='A';i<='I';i++)
{
semop(id,&v,1);
semctl(id, 1, SETVAL, 1);
semctl(id, 2, SETVAL, 1);
semctl(id, 3, SETVAL, 1);
write(fd, &i, 1);
semctl(id, 2, SETVAL, 0);
semctl(id, 3, SETVAL, 1);
semctl(id, 1, SETVAL, 1);
}
printf("Done...\n");
}
Процесс 2
#include<sys/types.h>
#include<sys/sem.h>
#include<sys/ipc.h>
#include<fcntl.h>
#include<stdio.h>
#include<unistd.h>
int main()
{
int id,ret,fd;
char i;
struct sembuf v;
id=semget(8,5, IPC_CREAT | 0644);
if(id <0)
{
printf("wrong\n");
}
fd= open("sample1", O_RDWR | O_APPEND | O_CREAT, 0644);
v.sem_num = 2;
v.sem_op = 0;
v.sem_flg = 0;
for(i='a';i<='i';i++)
{
semop(id,&v,2);
semctl(id, 1, SETVAL, 1);
semctl(id, 2, SETVAL, 1);
semctl(id, 3, SETVAL, 1);
write(fd, &i, 1);
semctl(id, 3, SETVAL, 0);
semctl(id, 1, SETVAL, 1);
semctl(id, 2, SETVAL, 1);
}
printf("Done...\n");
}
Процесс 3
#include<sys/types.h>
#include<sys/sem.h>
#include<sys/ipc.h>
#include<fcntl.h>
#include<stdio.h>
#include<unistd.h>
int main()
{
int id,ret,fd;
char i;
struct sembuf v;
id=semget(8,5, IPC_CREAT | 0644);
if(id <0)
{
printf("wrong\n");
}
fd= open("sample1", O_RDWR | O_APPEND | O_CREAT,0644);
v.sem_num = 3;
v.sem_op = 0;
v.sem_flg = 0;
for(i='1';i<='9';i++)
{
semop(id,&v,3);
semctl(id, 1, SETVAL, 1);
semctl(id, 2, SETVAL, 1);
semctl(id, 3, SETVAL, 1);
write(fd, &i, 1);
semctl(id, 1, SETVAL, 0);
semctl(id, 2, SETVAL, 1);
semctl(id, 3, SETVAL, 1);
}
printf("Done...\n");
}
Ожидаемый результат: Aa1Bb2Cc3Dd4Ee5Ff6Gg7Hh8Ii9. но я не получаю правильный вывод. Пожалуйста, можно ли помочь выйти из этой проблемы?
Какой семпахор хорош? семафор system V или семафор POSIX?
Я новичок в процессе синхронизации. Пожалуйста, помогите мне!
Заранее спасибо.