D4.7

//A B C
#include
<stdio.h>
#include
<stdlib.h>
#include
<unistd.h>
#include
<sys/sem.h>
#include
<sys/ipc.h>
int
main()
{
pid_t pid;
key_t key = ftok("/tmp/sem1",
‘k’);
int semid = semget(key, 3, 0644 |
IPC_CREAT);
if (semid < 0)
{
perror("sem get error!");
exit(1);
}
//鍒濆鍖栦俊鍙烽噺
semctl(semid, 0, SETVAL, 1);
semctl(semid, 1, SETVAL, 0);
semctl(semid, 2, SETVAL, 0);
pid = fork();
if (pid < 0)
{
perror("fork error!");
exit(1);
}
if (pid == 0)
{
pid = fork();
if (pid < 0)
{
perror("fork frok
error!");
exit(1);
}
if (pid == 0)
{
while (1)
{
struct sembuf sem3;
sem3.sem_num = 2;
sem3.sem_op = -1;
sem3.sem_flg = SEM_UNDO;
semop(semid, &sem3, 1);
sleep(1);
printf("C\n");
sleep(1);
struct sembuf sem;
sem.sem_num = 0;
sem.sem_op = 1;
sem.sem_flg = SEM_UNDO;
semop(semid, &sem, 1);
}
}
else if (pid > 0)
{
while (1)
{
struct sembuf sem2;
sem2.sem_num = 1;
sem2.sem_op = -1;
sem2.sem_flg = SEM_UNDO;
semop(semid, &sem2, 1);
sleep(1);
printf("B\n");
sleep(1);
struct sembuf sem3;
sem3.sem_num = 2;
sem3.sem_op = 1;
sem3.sem_flg = SEM_UNDO;
semop(semid, &sem3, 1);
}
}
}
else if (pid > 0)
{
while (1)
{
struct sembuf sem;
sem.sem_num = 0;
sem.sem_op = -1;
sem.sem_flg = SEM_UNDO;
semop(semid, &sem, 1);
sleep(1);
printf("A\n");
sleep(1);
struct sembuf sem2;
sem2.sem_num = 1;
sem2.sem_op = 1;
sem2.sem_flg = SEM_UNDO;
semop(semid, &sem2, 1);
}
}
return 0;
}



进程线程的编程练习题
D4.8





线程间通信



本文通过一个具体的编程实例,展示了如何使用信号量进行进程间的同步与通信。代码详细演示了父进程与子进程如何通过信号量控制执行顺序,实现A、B、C的循环打印。
1228

被折叠的 条评论
为什么被折叠?



