gpt4 book ai didi

c - 与进程树中的兄弟共享PID

转载 作者:行者123 更新时间:2023-11-30 19:18:28 25 4
gpt4 key购买 nike

嗯,我必须发送信号来处理 sibling ,但我不知道如何。我试图将它们保存在 pidx 和 pidy 中,但我认为这是错误的,因为我得到了奇怪的值,比如负数。我举了一个简单的例子来说明我的问题,认为如果第三个 child 可以得到他 sibling 的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 向另一个进程发送信号,但是,如果我不知道如何与它的 sibling 进行通信,我将无法继续。

#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);
}

最佳答案

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

关于c - 与进程树中的兄弟共享PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26745449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com