我有以下代码块:
#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的新手,所以我需要一些帮助,以使我的代码工作。
感谢您的时间。
答案 0 :(得分:2)
wait(null)
等待子进程终止,在这种情况下,您等待孩子完全完成,然后再恢复您的&#34; ab&#34;循环,因此为什么&#34; ab&#34;显示一次后跟所有&#34; cd&#34;线。
您需要进一步思考如何在流程之间进行通信。您可以使用您的信号量(它们的值)来防止一个进程在取得进展的同时取得进展。