信号量和父亲的儿子过程

时间:2015-12-06 17:18:21

标签: c semaphore

我有这个代码创建一个过程&他的儿子,他们每个人都会在他的代码中创建一个“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);             
}

1 个答案:

答案 0 :(得分:0)

我测试了你的代码,我有

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

因此我无法重现你的问题。

尽管如此,我觉得你的问题来自于你父亲的过程不等待孩子完成的事实:你应该用sleep(2)取代waitpid(pid_P2, NULL, 0)以确保你没有#&# 39;在孩子完成工作之前退出。

也就是说,你的信号量似乎更像是一个信号量信号量的互斥量,因此父亲和孩子之间存在争用文件的访问权。似乎父亲总是在你的情况下胜出并且在儿子有时间写出超过“a”之前退出。因此,我认为您无法使用单个信号量实现AaBbCcDdEeFf ... Zz目标。