信号量安全 shell C
Semaphores secure shell C
嘿伙计们,我最近开始做什么,我不太擅长使用信号量。我想要做的是让一个进程显示一个数字(例如 1),另一个进程显示 2,然后切换回第一个进程显示 3,然后返回第二个进程显示 4,依此类推……目前我能够显示 1 然后 2 然后 3 但不幸的是它回到 1 而不是显示 4.How 我让它显示 4 。请帮助:)
//critical.c
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <stdlib.h>
#include "se_sems.h"
int main(int argc, char argv[])
{
const int ONE_DONE = 0;
const int TWO_DONE = 1;
volatile int flag = ONE_DONE;
//Use our source file as the "key"
int id = se_semget("critical.c",1);
int pid = fork();
if (pid) {
//P1
while(1) {
flag = ONE_DONE;
se_wait(id);
printf("2222222222 \n");
printf("22222222222 \n");
fflush(stdout);
se_signal(id);
flag = TWO_DONE;
do {
sleep(1);
} while (flag == ONE_DONE);
printf("444444444444 \n");
printf("44444444444 \n");
se_signal(id);
}
} else {
//P2
while (1) {
flag = TWO_DONE;
se_wait(id);
printf("1111111 \n");
printf("1111111 \n");
fflush(stdout);
se_signal(id);
flag = ONE_DONE;
do {
sleep(1);
} while (flag == TWO_DONE);
printf("33333333 \n");
printf("3333333333 \n");
se_signal(id);
}
}
}
输出
1111111
1111111
2222222222
22222222222
33333333
3333333333
1111111
1111111
444444444444
44444444444
2222222222
22222222222
33333333
3333333333
1111111
1111111
444444444444
44444444444
等等:)
我发现最简单的方法是将最后一个显示留空,这样看起来就像按顺序显示一样。所以不,你不需要 2 个信号量。
嘿伙计们,我最近开始做什么,我不太擅长使用信号量。我想要做的是让一个进程显示一个数字(例如 1),另一个进程显示 2,然后切换回第一个进程显示 3,然后返回第二个进程显示 4,依此类推……目前我能够显示 1 然后 2 然后 3 但不幸的是它回到 1 而不是显示 4.How 我让它显示 4 。请帮助:)
//critical.c
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <stdlib.h>
#include "se_sems.h"
int main(int argc, char argv[])
{
const int ONE_DONE = 0;
const int TWO_DONE = 1;
volatile int flag = ONE_DONE;
//Use our source file as the "key"
int id = se_semget("critical.c",1);
int pid = fork();
if (pid) {
//P1
while(1) {
flag = ONE_DONE;
se_wait(id);
printf("2222222222 \n");
printf("22222222222 \n");
fflush(stdout);
se_signal(id);
flag = TWO_DONE;
do {
sleep(1);
} while (flag == ONE_DONE);
printf("444444444444 \n");
printf("44444444444 \n");
se_signal(id);
}
} else {
//P2
while (1) {
flag = TWO_DONE;
se_wait(id);
printf("1111111 \n");
printf("1111111 \n");
fflush(stdout);
se_signal(id);
flag = ONE_DONE;
do {
sleep(1);
} while (flag == TWO_DONE);
printf("33333333 \n");
printf("3333333333 \n");
se_signal(id);
}
}
}
输出
1111111
1111111
2222222222
22222222222
33333333
3333333333
1111111
1111111
444444444444
44444444444
2222222222
22222222222
33333333
3333333333
1111111
1111111
444444444444
44444444444
等等:)
我发现最简单的方法是将最后一个显示留空,这样看起来就像按顺序显示一样。所以不,你不需要 2 个信号量。