英文:
buffer handling through forks and file pointers
问题
I see that you want the code part to remain untranslated. Here's the translation of the text you provided:
"I've been trying to code a C program that simulates a whole tournament and prints the results into a logfile. Each match from each segment has to run on an individual thread/process (in my case I chose a process). When I'm writing in the logs, the output was completely out of my expectations. I get 8 times End of the 8th of finals
(hence the translation, I wrote this in French since it's my native language). I understood that each child process is writing, but they were supposed to be killed before...
Here's the code:
Father creates nbMatch processes, each process launches a match as expected, but when I launch the program, I expected an output in the file as written below:
...
Though I get an output as follows:
...
I wish I'd have the expected output, but I can't even locate where the issue is."
Please let me know if you need further assistance.
英文:
I've been trying to code a C program that simulates a whole tournament and prints the results into a logfile. Each match from each segment has to run on an individual thread/process (in my case I chose a process). When I'm writing in the logs, the output was completely out of my expectations. I get 8 times End of the 8th of finals
(hence the translation, I wrote this in french since it's my native language). I understood that each childprocess is writing, but they were supposed to be killed before...
Here's the code:
[...]
/**data preparation and stuff**/
for(int i = 0; i < nbMatch; i++){
int pid = fork();
if(pid == -1){
perror("Error occured while forking\n");
return 1;
}else if(pid == 0){
srand(getpid());
Team t;
if(mode == 2){
P(mutId);
t = match(tabMatch[i],mode,fx);
V(mutId);
}
else{
t = match(tabMatch[i],mode,fx);
}
Message buf;
if((msgsend(msgid, buf, teamName(t), strlen(teamName(t)))) == -1){
perror("Error occured while putting a message in the queue, shutting down\n");
return 4;
}
exit(0);
}
}
while((wpid = wait(&status)) > 0);//waiting for every children processes to die.
Message buffer;
char *res;
for(int i = 0; i < nbMatch; i++){
res = msgrecv(msgid,buffer);
Team t = getTeam(b,res);
Team the = getOponent(tabMatch, (*t).name, nbMatch);
fprintf(fx,"Match numéro %d du %d de finale: Perdant : %s , Gagnant : %s\n",i+1,
nbMatch,
t->name,
the->name);
b = suppTeam(b,t);
}
fprintf(fx,"---FIN DU %d DE FINALE---\n", nbMatch);
nbMatch = nbMatch / 2;
if(nbMatch == 0){
mutfree(mutId);
finBracket = 1;
printf("\33[1;32mThe grand winner is : %s \33[0m\n",teamName(b->team));
}else{
printf("\nEnd of the segment\n\n\n");
}
}
/*Other stuff*/
Father creates nbMatch processes, each process launches a match as expected, but when I launch the program, I expected an output in file as written below :
Match numéro 1 du 8 de finale: Perdant : Orange , Gagnant : famas viseur holo chargeur grande capacité
Match numéro 2 du 8 de finale: Perdant : Condeflan , Gagnant : Quiperd
Match numéro 3 du 8 de finale: Perdant : Sertgille , Gagnant : Pau
Match numéro 4 du 8 de finale: Perdant : ekip , Gagnant : griffondor
Match numéro 5 du 8 de finale: Perdant : BoisBubulle , Gagnant : denis
Match numéro 6 du 8 de finale: Perdant : Antredonc , Gagnant : Nan
Match numéro 7 du 8 de finale: Perdant : Free , Gagnant : L'ile
Match numéro 8 du 8 de finale: Perdant : FC bretagne , Gagnant : Brusxsscsel
---FIN DU 8 DE FINALE---
Match numéro 1 du 4 de finale: Perdant : Pau , Gagnant : griffondor
Match numéro 2 du 4 de finale: Perdant : Brusxsscsel , Gagnant : Quiperd
Match numéro 3 du 4 de finale: Perdant : L'ile , Gagnant : denis
Match numéro 4 du 4 de finale: Perdant : Nan , Gagnant : famas viseur holo chargeur grande capacité
---FIN DU 4 DE FINALE---
[...]
---FIN DU 2 DE FINALE---
[Till the eof...]
Though I get an output as follows:
Match numéro 1 du 8 de finale: Perdant : Orange , Gagnant : famas viseur holo chargeur grande capacité
Match numéro 2 du 8 de finale: Perdant : Condeflan , Gagnant : Quiperd
Match numéro 3 du 8 de finale: Perdant : Sertgille , Gagnant : Pau
Match numéro 4 du 8 de finale: Perdant : ekip , Gagnant : griffondor
Match numéro 5 du 8 de finale: Perdant : BoisBubulle , Gagnant : denis
Match numéro 6 du 8 de finale: Perdant : Antredonc , Gagnant : Nan
Match numéro 7 du 8 de finale: Perdant : Free , Gagnant : L'ile
Match numéro 8 du 8 de finale: Perdant : FC bretagne , Gagnant : Brusxsscsel
---FIN DU 8 DE FINALE---
Match numéro 1 du 4 de finale: Perdant : Pau , Gagnant : griffondor
Match numéro 2 du 4 de finale: Perdant : Brusxsscsel` , Gagnant : Quiperd`
Match numéro 3 du 4 de finale: Perdant : L'ile` , Gagnant : denis
Match numéro 4 du 4 de finale: Perdant : Nan` , Gagnant : famas viseur holo chargeur grande capacité
---FIN DU 4 DE FINALE---
Match numéro 1 du 8 de finale: Perdant : Orange` , Gagnant : famas viseur holo chargeur grande capacité
Match numéro 2 du 8 de finale: Perdant : Condeflan` , Gagnant : Quiperd`
Match numéro 3 du 8 de finale: Perdant : Sertgille , Gagnant : Pau
Match numéro 4 du 8 de finale: Perdant : ekip , Gagnant : griffondor
Match numéro 5 du 8 de finale: Perdant : BoisBubulle` , Gagnant : denis
Match numéro 6 du 8 de finale: Perdant : Antredonc` , Gagnant : Nan`
Match numéro 7 du 8 de finale: Perdant : Free` , Gagnant : L'ile`
Match numéro 8 du 8 de finale: Perdant : FC bretagne , Gagnant : Brusxsscsel`
---FIN DU 8 DE FINALE---
Match numéro 1 du 4 de finale: Perdant : Pau , Gagnant : griffondor
Match numéro 2 du 4 de finale: Perdant : Brusxsscsel` , Gagnant : Quiperd`
Match numéro 3 du 4 de finale: Perdant : L'ile` , Gagnant : denis
Match numéro 4 du 4 de finale: Perdant : Nan` , Gagnant : famas viseur holo chargeur grande capacité
---FIN DU 4 DE FINALE---
[till the eof...]
I wish i'd have the expected output, but i can't even locate where the issue is.
答案1
得分: 1
我不确定你等待所有子进程结束的方式。我无法理解它。
我会简单地使用循环等待(wait())匹配次数。
这仍然不能解释为什么子进程访问结尾,但从我理解的情况来看,可能是你的代码的其他地方出了问题(你的代码在上面的更改后运行得很正常)。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main ()
{
int nbMatch = 8;
for (int i = 0; i < nbMatch; i++) {
printf("Started!\n");
int pid = fork();
if (pid == -1)
{
perror ("Error occured while forking\n");
return 1;
}
else if (pid == 0)
{
printf ("Jsuis mort\n");
exit (0);
}
}
int i = nbMatch;
while (i > 0) {
wait(NULL);
i--;//waiting for every children processes to die.
}
nbMatch = nbMatch / 2;
printf ("\nEnd of the segment\n\n\n");
}
Started!
Started!
Started!
Started!
Started!
Started!
Started!
Started!
Jsuis mort
Jsuis mort
Jsuis mort
Jsuis mort
Jsuis mort
Jsuis mort
Jsuis mort
Jsuis mort
End of the segment
英文:
I am not sure about the way you wait for all children to die. I can't make sense of it.
I would simply loop wait() for matchNb times.
That still wouldn't explain why the children access the end but from what I can understand it might be something somewhere else in your code (Your code with the changes above worked pretty normal).
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main ()
{
int nbMatch = 8;
for (int i = 0; i < nbMatch; i++) {
printf("Started!\n");
int pid = fork();
if (pid == -1)
{
perror ("Error occured while forking\n");
return 1;
}
else if (pid == 0)
{
printf ("Jsuis mort\n");
exit (0);
}
}
int i = nbMatch;
while (i > 0) {
wait(NULL);
i--;//waiting for every children processes to die.
}
nbMatch = nbMatch / 2;
printf ("\nEnd of the segment\n\n\n");
}
Started!
Started!
Started!
Started!
Started!
Started!
Started!
Started!
Jsuis mort
Jsuis mort
Jsuis mort
Jsuis mort
Jsuis mort
Jsuis mort
Jsuis mort
Jsuis mort
End of the segment
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论