我有这个代码创建一个过程&他的儿子,他们每个人都会在他的代码中创建一个“for循环”,它将写入a到z和A到Z的文件;只使用一个信号量,创建的文件只包含从“A”到“Z”的大写字母和一个“a”,这意味着只有父亲完成了他的循环,而儿子只能运行一次。
使用两个信号量,我设法运行代码,就像我想要AaBbCcDdEeFf ... Zz
所以我的问题是关于以下代码(有一个信号量),为什么儿子没有完成他的循环?
感谢您的帮助
编辑:clef =代码中的键
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<unistd.h>
#include<stdio.h>
main()
{
int pid_P2,clef,sema;
char i;
ushort tab_sema[1];
struct sembuf operation [1];
FILE *p ;
p=fopen("file.txt","w");
if (p==NULL)
{
perror("Error opening file");
exit(0);
}
clef=ftok("file.txt",8);
operation[0].sem_num=0;
operation[0].sem_flg=0;
pid_P2=fork();
sema=semget(clef,1,IPC_CREAT|0600);
if (sema==-1) { perror("pb semget");
exit(0); }
semctl(sema,0,SETVAL,1);
if (pid_P2==0)
{ /* Son's Code */
for (i='a';i<'z'+1;i++)
{
operation[0].sem_op=-1;
semop(sema,operation,1);
fprintf(p,"%c",i);
fflush(p);
operation[0].sem_op=+1;
semop(sema,operation,1);
}
exit(0);
}
else{ /* Father's Code */
for (i='A';i<'Z'+1;i++)
{
operation[0].sem_op=-1;
semop(sema,operation,1);
fprintf(p,"%c",i);
fflush(p);
operation[0].sem_op=+1;
semop(sema,operation,1);
}
sleep(2);
exit(0);
}
fclose(p);
}
答案 0 :(得分:0)
我测试了你的代码,我有
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
因此我无法重现你的问题。
尽管如此,我觉得你的问题来自于你父亲的过程不等待孩子完成的事实:你应该用sleep(2)
取代waitpid(pid_P2, NULL, 0)
以确保你没有#&# 39;在孩子完成工作之前退出。
也就是说,你的信号量似乎更像是一个信号量信号量的互斥量,因此父亲和孩子之间存在争用文件的访问权。似乎父亲总是在你的情况下胜出并且在儿子有时间写出超过“a”之前退出。因此,我认为您无法使用单个信号量实现AaBbCcDdEeFf ... Zz目标。