[英]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.