【问题标题】:Sharing PID with brothers in process tree与进程树中的兄弟共享 PID
【发布时间】:2014-11-04 21:33:36
【问题描述】:

好吧,我必须向进程兄弟姐妹发送信号,但我不知道如何。我试图将它们保存在 pidx 和 pidy 中,但我认为这是错误的,因为我得到了奇怪的值,比如负数。我为我的问题举了一个简单的例子,认为如果第三个孩子可以拥有他兄弟姐妹的pid,我可以解决它。我正在使用 Ubuntu 编译 (POSIX) 和 C 。

#include <stdio.h>
#include <unistd.h>
main(void)
{
pid_t pid;
int x, pidx, pidy;

for(x=1;x<=3;x++)
    {

    pid=fork(); 
    if(pid)
    {
        printf("I'm the process %d\n",getpid());
        sleep(2);
   }

    else{
       //X process
       if (x==0){

           printf("I'm the child %d, my parent is %d\n",getpid(),getppid());
           pidx=getpid();
           sleep(2);
           exit(0);
      }

     //Y process

      if (x==1)
      {
          printf("I'm the child %d, my parent is %d\n",getpid(),getppid());
          pidy=getpid();
          sleep(2);
          exit(0);

    }

      //Z process

      if (x==2)
      {
          printf("I'm the child %d, my parent is %d, and my siblings are \n",getpid(),getppid(), pidx, pidy);
          sleep(2);
          exit(0);

      }


   }
return 0;
}

我的原始代码,如果太长,请见谅。 Bisabuelo 的意思是孙子(我不确定这个词在英语中的含义), abuelo 的意思是孙子。如果我在终端中请求它,我需要从 Z 向另一个进程发送信号,但是,如果我不知道如何与它的兄弟姐妹通信,我将无法继续。

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
void a(){
  printf("Hi, I'm A with PID %d", getpid());
  execlp("pstree","pstree","-la", NULL);

}
void b(){
    printf("Hi, I'm B with PID %d", getpid());
    execlp("pstree","pstree","-la", NULL);

}
void x(){
      printf("Hi, I'm X with PID %d", getpid());
    execlp("ls","ls","-la", NULL);

}
void y(){
    printf("Hi, I'm Y with PID %d", getpid());
    execlp("ls","ls","-la", NULL);

}


int main(int argc, char *argv[])
{ 
 int i, e;
 int bisabuelo, abuelo;
pid_t pid1, pid2, pid3, pidx, pidy;
bisabuelo=getpid();
    if ((pid1=fork())==0 ){
        abuelo=getpid();
        if ((pid2=fork())==0){
            for (i=0;i<3;i++)

            {
                    if ((pid3=fork())>0){
                    if (i==0){
                    printf("I'm a grandson (%d) son of %d, grandson of %d\n",getpid(), getppid(), bisabuelo);
                    signal(SIGUSR1,b);
                    sleep(0);
                    }

                }

                else{
                    sleep(0);
                    switch (i){
                      case 0:{
                        pidx=getpid();
                        printf("I'm the grandgrandson? X (%d) son of %d, grandson of %d, grandgrandson? of %d\n",getpid(), getppid(), abuelo, bisabuelo);
                        signal(SIGUSR1,x);
                        sleep(7);
                        printf("I'm X(%d) and die \n", getpid());
                        exit(0);
                     break; 
                      }
                      case 1:{
                        pidy=getpid();
                        printf("I'm the grandgrandson? Y (%d) son of %d, grandson of %d, grandgrandson? of %d\n",getpid(), getppid(), abuelo, bisabuelo);
                        sleep(5);
                        signal(SIGUSR1,y);
                        printf("Soy Y(%d) y muero \n", getpid());
                        exit(0);


                     break; 
                      }
                      case 2:{
                        printf("I'm the grandgrandson? Z (%d) son of %d, grandson of %d, grandgrandson? of %d\n",getpid(), getppid(), abuelo, bisabuelo);
                        printf("My sibling X is %d and my sibling Z is %d", pidx, pidy);

                        switch (argv[1][0]);
                    {
                        case 'A':
                            //kill(abuelo, SIGUSR1);
                            printf("Me han pasado A");
                            break;
                        case 'B':
                            //kill(getppid, SIGUSR1);
                            printf("Me han pasado B");

                            break;

                        default:
                            printf("No ha introducido ningún argumento");
                            break;
                    }


                        sleep(3);
                        printf("I'm Z (%d) and I die \n", getpid());
                        exit(0);
                     break; 
                      }
                    }
                  }
                }
                    wait(&e);
                    wait(&e);
                    wait(&e);
                    sleep(1);
                    printf("I'm B(%d)and I die \n", getpid());


        }
        else{
            printf("I'm A (%d, son of %d)\n", getpid(), getppid());
            signal(SIGUSR1,a);
            wait(&e);
            sleep(1);
            printf("I'm A(%d) and i die \n", getpid());

        }
    }

        else{
            printf("I'm arb (%d)\n", getpid());
            wait(&e);
            printf("I'm arb(%d)and I die\n", getpid());
        }
        sleep(1);

    exit (0);
}

【问题讨论】:

  • “我认为这是错误的”:为什么?您看到了什么行为,它与您的预期有何不同?
  • 也是性别歧视者。 “兄弟姐妹”在政治上会更正确:)
  • 我认为是错误的,因为我得到了奇怪的值,比如负数。而且,对性别歧视感到抱歉......但在我的国家,这个过程是男性化的,我称之为兄弟:/,我会尝试编辑。
  • 你能展示你的实际代码吗?上面的代码无法编译,因为 {} 不平衡。 (如果我解决了这个问题,它就可以正常工作了。)另外,不要在孩子中调用exit,使用_exit
  • 是的,我可以展示我的代码,但是有点乱:(

标签: c process fork posix pid


【解决方案1】:

要向多个进程发送信号,您可以使用“进程组”。基本上,向pid= -x 发送信号将使系统将信号传递给进程组 x 中的每个进程。您必须确保所有“兄弟”进程(而不是其他进程)都在同一个进程组中。 阅读更多:man 2 killhttp://en.wikipedia.org/wiki/Process_group

【讨论】:

  • 小心,getpid 和 getppid 将在出错时返回 -1。不要将 sigkill 发送到进程组 -1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 2019-12-09
相关资源
最近更新 更多