缓冲区处理通过分支和文件指针

huangapple go评论58阅读模式
英文:

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 &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt; 
#include &lt;sys/wait.h&gt;

int main ()
{
  int nbMatch = 8;
  for (int i = 0; i &lt; nbMatch; i++) {
    printf(&quot;Started!\n&quot;);
    int pid = fork();
    if (pid == -1)
	{
	  perror (&quot;Error occured while forking\n&quot;);
	  return 1;
	}
    else if (pid == 0)
	{
	  printf (&quot;Jsuis mort\n&quot;);
	  exit (0);
	}
  }
  int i = nbMatch;
  while (i &gt; 0) {
    wait(NULL);
    i--;//waiting for every children processes to die.
  }
  nbMatch = nbMatch / 2;
  printf (&quot;\nEnd of the segment\n\n\n&quot;);
}
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

huangapple
  • 本文由 发表于 2023年3月31日 20:10:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/75898384.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定