我有以下的代码块:
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "display.h"
int main()
{
int i;
if (fork())
{
for (i=0;i<10;i++)
display("ab");
wait(NULL);
}
else
{
for (i=0;i<10;i++)
display("cd\n");
}
return 0;
}
display.c是什么:
/* DO NOT EDIT THIS FILE!!! */
#include <stdio.h>
#include <unistd.h>
#include "display.h"
void display(char *str)
{
char *p;
for (p=str; *p; p++)
{
write(1, p, 1);
usleep(100);
}
}
并且 display.h 是:
/* DO NOT EDIT THIS FILE!!! */
#ifndef __CEID_OS_DISPLAY_H__
#define __CEID_OS_DISPLAY_H__
void display(char *);
#endif
如果我运行这段代码,输出结果将是:
abacdb
abcdab
acdbababa
cbadb
cad
bcd
cd
cd
cd
cd
我想使用信号量来实现以下输出:
abcd
abcd
abcd
....
我尝试做到这一点的方法如下:
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/wait.h>
#include "display.h"
#include <semaphore.h>
#include <stdio.h>
int main()
{
int i, my_sem, v1,v2,t;
my_sem = semget(IPC_PRIVATE, 1, 0600); /* CREATE OF THE SEMAPHORES */
struct sembuf up = {0, 1, 0};
struct sembuf down = {0, -1, 0};
if (fork())
{
for (i=0;i<10;i++){
display("ab");
semop(my_sem, &up, 1); /* UP (); */
wait(NULL);
}
}
else
{
for (i=0;i<10;i++){
semop(my_sem, &down, 1); /* DOWN (); */
display("cd\n");
semop(my_sem, &up, 1); /* UP (); */
}
}
return 0;
}
我的代码输出结果为:
abcd
cd
cd
cd
cd
cd
cd
cd
cd
cd
ababababababababab
看起来只有第一次有效。我对sempaphores非常新,因此需要帮助以使我的代码运行。
感谢您的时间。
POSIX信号量允许进程和线程同步它们的操作。
- Enzo Ferber