Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/ipc.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/sem.h>
- #include <sys/wait.h>
- volatile int flag = 0;
- void handler(int sig) {
- flag = 1;
- }
- void makeOp(struct sembuf * buf, short num, short op) {
- buf->sem_num = num, buf->sem_op = op, buf->sem_flg = 0;
- }
- int main(int argc, char ** argv) {
- int fd[2];
- pipe(fd);
- int sem_key = ftok(argv[0], 1);
- int semid = semget(sem_key, 2, IPC_CREAT | IPC_EXCL | 0666);
- signal(SIGINT, handler);
- int curValue = 0;
- struct sembuf buf;
- FILE * in = fdopen(fd[0], "r");
- FILE * out = fdopen(fd[1], "w");
- if (!fork()) {
- while (1) {
- if (flag) {
- printf("%d\n", curValue);
- fflush(stdout);
- break;
- }
- makeOp(&buf, 1, -1);
- semop(semid, &buf, 1);
- fscanf(in, "%d", &curValue);
- ++curValue;
- fprintf(out, "%d\n", curValue);
- makeOp(&buf, 0, 1);
- semop(semid, &buf, 1);
- }
- fclose(in), fclose(out);
- return 0;
- }
- fprintf(out, "%d\n", 1); // начинаем с единички
- makeOp(&buf, 1, 1);
- semop(semid, &buf, 1);
- while (1) {
- if (flag) {
- printf("%d\n", curValue);
- fflush(stdout);
- break;
- }
- makeOp(&buf, 0, -1);
- semop(semid, &buf, 1);
- fscanf(in, "%d", &curValue);
- ++curValue;
- fprintf(out, "%d\n", curValue);
- makeOp(&buf, 1, 1);
- semop(semid, &buf, 1);
- }
- fclose(in), fclose(out);
- semctl(semid, 0, IPC_RMID);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement