/* write_fifo.c源代码 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> int main(int argc, char **argv) { int ret; int fd; int count = 0; char buf[32] = {0}; if (argc < 2) { printf("Usage:%s <fifo name>\n", argv[0]); exit(EXIT_FAILURE); } if (access(argv[1], F_OK) == -1) { ret = mkfifo(argv[1], 0777); if (ret < 0) { printf("mkfifo is error\n"); exit(EXIT_FAILURE); } else { printf("mkfifo is ok\n"); } } else { printf("%s is exist\n", argv[1]); } fd = open(argv[1], O_WRONLY); if (fd < 0) { printf("fifo %s open error\n", argv[1]); } while (1) { sleep(1); snprintf(buf, sizeof(buf), "%s %d", "hello", (++count)); ssize_t size = write(fd, buf, strlen(buf)+1); if (size > 0) { printf("fifo write [%d] data_len: %ld\n", count, size); } } close(fd); exit(EXIT_SUCCESS); }
时间: 2024-04-17 10:29:30 浏览: 115
这是一个用于向 FIFO(命名管道)写入数据的 C 语言程序。它通过创建一个 FIFO 并打开它,然后不断往 FIFO 中写入数据。
程序首先检查命令行参数的数量,如果少于 2 个,则输出提示信息并退出。
接下来,程序检查指定的 FIFO 是否存在。如果不存在,则使用 mkfifo 函数创建 FIFO,并设置权限为 0777。如果创建失败,则输出错误信息并退出;如果创建成功,则输出提示信息。
如果指定的 FIFO 已经存在,则输出提示信息。
然后,程序使用 open 函数打开 FIFO,并将返回的文件描述符保存在变量 fd 中。如果打开失败,则输出错误信息。
最后,程序进入一个无限循环,在每次循环中,使用 snprintf 函数将要写入的数据写入缓冲区 buf,然后使用 write 函数将缓冲区中的数据写入到 FIFO 中。写入成功后,输出提示信息。
循环会一直执行,直到程序被手动终止。在程序结束之前,需要关闭文件描述符 fd。
请注意,此程序只负责写入数据到 FIFO,并不负责读取数据。
相关问题
程序设计,linux环境实现对write命令的中文支持,实现不同用户间的通信,并且支持管道、重定向
要实现对write命令的中文支持,可以使用以下步骤:
1. 修改系统的字符编码为UTF-8,并且设置locale为zh_CN.UTF-8。
2. 安装中文字体,以便在终端中正常显示中文字符。
3. 修改write命令的源代码,使用支持中文字符编码的函数进行输出。
下面是一个示例代码,实现了对write命令的中文支持,在Linux环境下可以直接编译运行:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MAX_BUFFER_SIZE 1024
int main(int argc, char *argv[])
{
int fd;
char buffer[MAX_BUFFER_SIZE];
char *msg;
int i;
// 读取命令行参数
if (argc < 3) {
printf("Usage: %s <user> <message>\n", argv[0]);
exit(EXIT_FAILURE);
}
// 组合消息
msg = (char *)malloc(strlen(argv[1]) + strlen(argv[2]) + 4);
sprintf(msg, "[%s] %s\n", argv[1], argv[2]);
// 打开管道文件
fd = open("/tmp/myfifo", O_WRONLY);
if (fd == -1) {
printf("Error: Could not open fifo file.\n");
exit(EXIT_FAILURE);
}
// 写入消息
i = strlen(msg);
if (write(fd, msg, i) == -1) {
printf("Error: Could not write to fifo file.\n");
exit(EXIT_FAILURE);
}
close(fd);
free(msg);
return 0;
}
```
上述代码中,我们使用了open函数打开了一个名为“/tmp/myfifo”的管道文件,并使用write函数写入了消息。
为了实现不同用户间的通信,我们可以使用多个终端窗口,每个终端窗口打开一个write命令,然后使用管道文件进行通信。
支持管道和重定向则需要在write命令中增加管道和重定向功能的代码,例如:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define MAX_BUFFER_SIZE 1024
int main(int argc, char *argv[])
{
int fd;
char buffer[MAX_BUFFER_SIZE];
char *msg;
int i;
// 读取命令行参数
if (argc < 3) {
printf("Usage: %s <user> <message>\n", argv[0]);
exit(EXIT_FAILURE);
}
// 组合消息
msg = (char *)malloc(strlen(argv[1]) + strlen(argv[2]) + 4);
sprintf(msg, "[%s] %s\n", argv[1], argv[2]);
// 打开管道文件
fd = open("/tmp/myfifo", O_WRONLY);
if (fd == -1) {
printf("Error: Could not open fifo file.\n");
exit(EXIT_FAILURE);
}
// 写入消息
i = strlen(msg);
if (write(fd, msg, i) == -1) {
printf("Error: Could not write to fifo file.\n");
exit(EXIT_FAILURE);
}
// 支持管道和重定向
while (fgets(buffer, MAX_BUFFER_SIZE, stdin) != NULL) {
i = strlen(buffer);
if (write(fd, buffer, i) == -1) {
printf("Error: Could not write to fifo file.\n");
exit(EXIT_FAILURE);
}
}
close(fd);
free(msg);
return 0;
}
```
上述代码中,我们增加了一个while循环,通过标准输入读取用户输入的数据,并通过管道文件写入到另一个终端中。
这样,我们就实现了在Linux环境下对write命令的中文支持,并且支持不同用户间的通信,并支持管道和重定向。
阅读全文