1
我有这样的代码,创建一个进程&他的儿子,他们每个人都会做一个“for循环”,在他的代码,这将在写入文件从a到z和从A到Z ;只使用一个信号量,文件创建时只包含大写字母“A”到“Z”和一个“a”,这意味着只有父亲完成循环,而儿子只能运行一次。信号灯和父子进程
随着使用两个信号量我设法运行的代码我喜欢它想AABBCCDDEEFF ... ZZ
所以我的问题是关于下面的代码(有一个信号),为什么儿子不完整他的循环?
谢谢您的帮助
编辑:谱号=关键代码
#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);
}
谢谢你的回复,我不明白为什么,因为我尝试了在不同的机器,并有同样的问题,但无论如何,我明白我的错误,我会尝试使用waitpid函数,看看它是否工作,你无法重现的问题, 再次感谢你 ! – Silversprint
我发现我的问题,我发布的代码有“退出(0);”在儿子的过程之外的代码指令,使你的执行像你说的“ABC ... Zabcd ... z”,我的代码有“退出(0)”;里面的儿子的代码,使他退出循环,从而退出儿子的代码! – Silversprint