2015-12-06 57 views
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);    
} 

回答

0

我测试你的代码,我不得不

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 

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

不过在我看来,你的问题来自于一个事实,你的父进程不等待其子完成:你应该waitpid(pid_P2, NULL, 0)取代sleep(2),以确保你不会退出前的孩子完成自己的工作。

这就是说,你的信号似乎更像一个互斥体,一个信号旗语,从而有父亲和孩子对文件的访问之间的比赛中使用。看来,父亲总是赢得你的情况,并在儿子有时间写更多的'a'之前退出。因此我认为你将无法使用单个信号量来实现你的AaBbCcDdEeFf ... Zz目标。

+0

谢谢你的回复,我不明白为什么,因为我尝试了在不同的机器,并有同样的问题,但无论如何,我明白我的错误,我会尝试使用waitpid函数,看看它是否工作,你无法重现的问题, 再次感谢你 ! – Silversprint

+0

我发现我的问题,我发布的代码有“退出(0);”在儿子的过程之外的代码指令,使你的执行像你说的“ABC ... Zabcd ... z”,我的代码有“退出(0)”;里面的儿子的代码,使他退出循环,从而退出儿子的代码! – Silversprint