【发布时间】:2018-12-20 14:45:05
【问题描述】:
我需要创建具有 3 个进程的程序:
- 第一个进程应重复读取
/dev/urandom并通过管道在每个周期向第二个进程发送 15 个字符。 - 第二个进程应将接收到的数据转换为十六进制,并通过 fifo 将结果发送到第三个进程。
- 第三个进程应该打印接收到的数据。
这是我到目前为止写的。使用管道的通信工作正常,但是 fifo 存在一些问题 - 当我将 n 更改为更大的数字(例如 100000 或 1000000)时,程序无法启动。当它较小时,比如 500 或 1000,程序可以工作。这可能是什么原因?
这就是我运行它的方式:
cat /dev/urandom | ./a.out
这里是代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#define FIFO "my_fifo"
int main(void) {
int pdesk[2];
char buf[15];
char buffer[15];
char hex[30];
char f[30];
int len;
int n;
n = 100;
umask(0);
mkfifo(FIFO, 0666);
pipe(pdesk);
if (fork() == 0) {
for (int i = 0; i < n; i++) {
read(STDIN_FILENO, buffer, 15);
write(pdesk[1], buffer, 15);
}
close(pdesk[1]);
} else {
sleep(1);
int fp;
for(int i = 0; i < n; i++) {
read(pdesk[0], buf, 15);
for(int a = 0, b = 0; b < 30; ++a, b+= 2)
sprintf(hex + b, "%02x", buf[a] & 0xff);
fp = open(FIFO, O_WRONLY);
write(fp, hex, 30);
close(fp);
usleep(10000);
}
close(pdesk[0]);
}
if (fork() == 0) {
sleep(2);
int fp;
for (int i = 0; i < n; i++) {
fp = open(FIFO, O_RDONLY);
read(fp, f, 30);
printf("Odczytano: %s\n", f);
close(fp);
usleep(10000);
}
}
}
【问题讨论】:
-
难怪你不知道实际发生了什么:代码中没有一个错误检查。首先解决这个问题会向您揭示答案。