C 中的信号量和 fork()
Semaphores and fork() in C
我有以下代码块:
#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 的新手,所以我需要一些帮助才能使我的代码正常工作。
感谢您的宝贵时间。
wait(null)
等待子进程终止,在这种情况下,您正在等待子进程在恢复 "ab" 循环之前完全完成,因此显示 "ab" 的原因之后是所有 "cd" 行。
你需要进一步思考进程之间如何通信。您可以使用信号量(它们的值)来阻止一个进程取得进展,同时允许另一个进程取得进展。
我有以下代码块:
#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 的新手,所以我需要一些帮助才能使我的代码正常工作。
感谢您的宝贵时间。
wait(null)
等待子进程终止,在这种情况下,您正在等待子进程在恢复 "ab" 循环之前完全完成,因此显示 "ab" 的原因之后是所有 "cd" 行。
你需要进一步思考进程之间如何通信。您可以使用信号量(它们的值)来阻止一个进程取得进展,同时允许另一个进程取得进展。