Fix permission management for IPC and also for EXT2.
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
/// @file t_semop.c
|
||||
/// @brief Tests semop between processes.
|
||||
/// @copyright (c) 2014-2023 This file is distributed under the MIT License.
|
||||
/// See LICENSE.md for details.
|
||||
|
||||
#include "sys/sem.h"
|
||||
#include "stdio.h"
|
||||
#include "sys/ipc.h"
|
||||
#include "sys/errno.h"
|
||||
#include "sys/wait.h"
|
||||
#include "stdlib.h"
|
||||
#include "sys/unistd.h"
|
||||
#include "fcntl.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct sembuf sops[6];
|
||||
sops[0].sem_num = 0;
|
||||
sops[0].sem_op = -1;
|
||||
sops[0].sem_flg = 0;
|
||||
|
||||
sops[1].sem_num = 1;
|
||||
sops[1].sem_op = -1;
|
||||
sops[1].sem_flg = 0;
|
||||
|
||||
sops[2].sem_num = 2;
|
||||
sops[2].sem_op = -1;
|
||||
sops[2].sem_flg = 0;
|
||||
|
||||
sops[3].sem_num = 0;
|
||||
sops[3].sem_op = 1;
|
||||
sops[3].sem_flg = 0;
|
||||
|
||||
sops[4].sem_num = 1;
|
||||
sops[4].sem_op = 1;
|
||||
sops[4].sem_flg = 0;
|
||||
|
||||
sops[5].sem_num = 2;
|
||||
sops[5].sem_op = 1;
|
||||
sops[5].sem_flg = 0;
|
||||
|
||||
int status;
|
||||
|
||||
//create a semaphore set
|
||||
int semid = semget(17, 4, IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
|
||||
|
||||
//set the values of the semaphores
|
||||
unsigned short values[] = { 0, 0, 0, 1 };
|
||||
|
||||
union semun arg;
|
||||
arg.array = values;
|
||||
|
||||
if (semctl(semid, 0, SETALL, &arg) == -1) {
|
||||
perror("Failed to set semaphores");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!fork()) {
|
||||
semop(semid, &sops[0], 1);
|
||||
printf("cheers!\n");
|
||||
exit(0);
|
||||
}
|
||||
if (!fork()) {
|
||||
semop(semid, &sops[1], 1);
|
||||
printf("course, ");
|
||||
semop(semid, &sops[3], 1);
|
||||
exit(0);
|
||||
}
|
||||
if (!fork()) {
|
||||
semop(semid, &sops[2], 1);
|
||||
printf("systems ");
|
||||
semop(semid, &sops[4], 1);
|
||||
exit(0);
|
||||
}
|
||||
if (!fork()) {
|
||||
printf("From the operating ");
|
||||
semop(semid, &sops[5], 1);
|
||||
exit(0);
|
||||
}
|
||||
for (int n = 0; n < 4; n++) {
|
||||
wait(&status);
|
||||
}
|
||||
if (semctl(semid, 0, IPC_RMID, 0) == -1) {
|
||||
perror("Failed to remove IPC");
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user