- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使两个进程通过命名管道进行通信。它是这样的,首先我的进程“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/
Chisel 是否支持设计中的多个时钟?如果我想实现一个异步 fifo,如何在 Chisel 中实现呢? 最佳答案 是的,Chisel 支持设计中的多个时钟。如果你想使用异步fifo,你可以导入模块C
当在单个进程上使用 FIFO 时,看起来两端都打开然后关闭,不可能重用 FIFO。任何重新打开封闭端的尝试都会失败,或者返回的文件描述符无用。 是否有可能解决此问题,还是我们必须保持 FIFO 的两端
考虑以下场景: 名为 test 的 FIFO被 build 。在一个终端窗口 (A) 中,我运行 cat test 。现在可以在窗口 B 中写入并在窗口 A 中获取输出。也可以终止进程 A 并重新启动
是否有某种方法可用于在真正的 FIFO 中使用 Amazon SQS 消息?我尝试从配置延迟消息传递,但这没有帮助。 最佳答案 亚马逊SQS刚刚获得FIFO Queues with Exactly-O
我有一个非常简单的基本程序,它有两个进程,第一个是parent,第二个是child。 子进程应该向 FIFO 写入一些内容。在所有写作工作完成后(在 child 被终止后)。然后父进程应该读取所有
在 C 中使用 epoll,有什么方法可以让从 FIFO 读取的程序检测到写入同一 FIFO 的程序已将其关闭? 我以为这会生成一个 EPOLLHUP 事件,但显然它不会。 例子:我有一个读者和一个作
在 bash 脚本中,我使用管道将命令的输出传递给另一个命令的输入: $ output_com | input_com output_com 比 input_com 慢。在我的脚本中,在input_c
我试图在 3.12 内核中自己实现 FIFO 调度程序,我无法找到 FIFO 文件的位置...就像 rt.c 位于/kernel/sched/rt.c 最佳答案 您在寻找哪个调度程序? Linux 有
这个问题在这里已经有了答案: Implementing FIFO using LIFO (2 个答案) 关闭 6 年前。 我了解使 Push 操作昂贵或 pop 操作昂贵的传统方法。 如何让push
我正在学习 Linux 中的管道编程,但无法理解管道/FIFO 管理。 我写了一个小程序来打开我创建的 FIFO(在执行程序之前,我在终端中执行了 mkfifo newfifo)。然后我反复读取并转储
我有一个写入标准输出的进程,我希望能够在运行 tail -f 时通过 grepping 查找各种字符串来监视输出。执行此操作的一种方法是写入一个普通文件,然后对文件进行尾部搜索一个字符串,然后对另一个
我想将一些数据输出到管道并让其他进程逐行处理数据。这是一个玩具示例: mkfifo pipe cat pipe& cat >pipe 现在我可以输入我想要的任何内容,按下回车后我立即看到同一行。但是如
我正在尝试开发一个程序来播放和录制一些 rtmp 流。该程序是在Qt中开发的。 我正在使用 rtmpdump 和 mplayer。因为两者都在单独的进程中运行,所以我使用 fifo 将流从 rtmpd
所以我开始构建我的本地 iOS 设备环境。我已经完全设置并运行了我的模拟器环境。我已经通过 iOS 开发人员为应用程序正确设置了我的分发和配置文件。在尝试运行该应用程序时,我遵循以下步骤:使用 USB
S3-FIFO 本文作为下一篇缓存文章的预备知识。 背景 基于LRU和FIFO的驱逐 FIFO和LRU都是经典的缓存驱逐算法,在过去几十年中也出现了很多追求更高效率的驱逐算法,如ARC, 2Q
我可以为单向通信创建一个 FIFO。但我该如何进行双向沟通呢?我可以创建一个可以充当发送方的 C 文件,并打开另一个充当接收方的终端。但如何建立双向通信呢?谢谢! 最佳答案 你不能。尝试一个套接字。考
考虑下表: Id Verb Qty Price `1 Buy 6 10.0 `2 Sell 5 11.0 `3 Buy 4 10.0 `4 Sell 3 11.0 `5 Sell 8 9.0 `6
我有两个进程(“发送者”和“接收者”)需要通过 transient 单向 FIFO 通信管道在单台机器上本地进行通信。这是我想要发生的事情(使用更接近 Unix 域套接字的语言): 发送者在已知地址“
好的,所以我正在使用 FIFO,并且我正在尝试构建一个小型库以在 future 的程序中使用。 它应该能够创建一个命名管道,读取它并在其中写入。 我能够完成所有这些功能,但它没有正确读取。问题如下:
数组有循环缓冲区版本吗?假设一次最大推送元素的数量已知,我是否必须派生自己的 FIFO 队列来提高性能? 这是我尝试过的: 循环实现: function CBuf(n) { var ctrPu
我是一名优秀的程序员,十分优秀!