gpt4 book ai didi

c - 两个进程之间的 FIFO 通信

转载 作者:行者123 更新时间:2023-11-30 15:04:38 24 4
gpt4 key购买 nike

我正在尝试使两个进程通过命名管道进行通信。它是这样的,首先我的进程“prac” fork 成n个 child (目前只有1个),这些 child 通过信号(下面代码中的scanf)接收他们必须启动“execl(dadesPrac)”的时间只需要通过 FIFO 向其父级写入一个字符串即可。问题是,它似乎被困在 FIFO 中。 我什至没有通过终端看到消息:

"printf("我终于写了 %s\n",buffer);"

写入的进程通过前面说过的execl的参数获取fifo的“名称”,它是这样的:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#define MAX_BUF 64
#include <string.h>
#include <errno.h>
#include <signal.h>
int main(int argc, char **argv){
int fd;
char buffer[MAX_BUF] = "";
char aux[MAX_BUF] = "";
int MaxTemp;
printf("%s , %s , %s \n",argv[0],argv[1],argv[2]);
if(argc == 3){
srand(time(NULL));
MaxTemp = (rand() % 50) + 10;
printf("I'M IN EXEC\n");
sprintf(aux,"%i",MaxTemp);
printf(" MAXTEMP %s\n",aux);
strcat(buffer,aux);

strcat(buffer,argv[2]);
printf("what i'm gonna write is %s\n",buffer);
fd = open(argv[1],O_WRONLY);
write(fd, buffer, sizeof(MAX_BUF));
printf("i finally wrote %s\n",buffer);
close(fd);
//unlink(argv[1]);

}else{
perror(" number of parameters incorrect");
}



printf("i'm gonna exit\n");
_exit(0);
}

流程prac的代码如下:

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#define MAX_BUF 64
#include <string.h>
#include <errno.h>
#include <signal.h>

int senyal = 0;

void empezar(int signum){
senyal++;
}


void make_fifo(char * myfifo){
/* crea l'arxiu fifo en cas de que ja no existeixi previament*/
int m;

if ((m = mkfifo(myfifo, 0666)) < 0){
if (errno != EEXIST){
perror ("mkfifo");
}
}
}
int main(int argc,char **argv) {

int m;
int pid11;
int fd, pid1,pid2,pid3,auxint,auxint2,status;
char * npipe1 = "/tmp/npipe1";
char buf[MAX_BUF];
char aux[MAX_BUF];
pid1 = fork();
if(pid1 == 0){

//child1
make_fifo(npipe1);
pid11 = fork();

if(pid11 == 0){
//grandson1
printf("inside grandson \n");
signal(SIGUSR1,empezar);
while(!senyal){
printf("im in the while\n");
sleep(1);
}
printf("i'm out of the while\n");
sprintf(aux,"%i",getpid());
execl("./dadesPrac","dadesPrac",npipe1,aux,NULL);


}
printf("almost waitpid\n");
wait(NULL);
printf("after waitpid\n");
fd = open(npipe1,O_RDONLY);
read(fd, buf, sizeof(MAX_BUF));
close(fd);
printf("%s",buf);

//do sql stuff
}

printf("i'm in dad \n");
scanf("%i",&auxint2);
kill(pid11,SIGUSR1);
wait(NULL);
return 0;
}

老实说,我迷路了,对可能的错误感到抱歉,我不是母语人士,所以很难清楚地解释自己。

最佳答案

我认为问题在于你 fork 和处理信号的方式。

当您的 prac 第一次 fork 时,您已将子进程的 pid 分配给 pid1。然后父级(原始 prac)调用 scanf() 并等待。

您的子进程(prac child)再次调用fork(),并将孙进程的pid分配给pid11(prac孙进程)。

然后您尝试使用父级(原始 prac)将信号发送给孙级(pid11)。但是,父级没有孙级的正确 pid,因为孙级是由子级代码而不是父级代码创建的。父进程中的 pid11 仍然是其默认值,在您的代码中未定义。

因此,当您输入某些输入时,父级会执行 kill() 函数,如果 pid11 的默认值为 0,则意味着将信号发送给所有具有相同进程组 ID 的进程(引用 kill() )。如果pid11不为0,则信号被发送到错误的进程。

此外,您只编写为孙进程安装信号处理程序的代码,因此父进程和子进程都会被终止。因此没有人会读取 FIFO。

关于c - 两个进程之间的 FIFO 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40210490/

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