簡體   English   中英

信號量和父子過程

[英]Semaphore and father son process

我有這個創建一個進程的代碼,他的兒子每個人都會在他的代碼中創建一個“ 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);             
}

我測試了您的代碼,

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

因此,我無法重現您的問題。

不過,在我看來,您的問題出在您的父親進程不等待其子進程完成而引起的問題:您應該用waitpid(pid_P2, NULL, 0)替換sleep(2) ,以確保在此之前不退出這個孩子完成了工作。

就是說,您的信號量似乎更像是一個信號量信號量的互斥體,因此父親和孩子之間存在着爭用文件的競爭。 父親似乎總是在您的案子中獲勝,並在兒子有時間寫超過“ a”的字母之前退出。 因此,我認為您將無法使用單個信號量實現AaBbCcDdEeFf ... Zz目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM