有名管道的写操作

本文介绍了一个简单的C语言程序实例,展示了如何利用FIFO(命名管道)进行进程间的通信。程序首先创建一个FIFO文件,然后打开它并尝试写入从标准输入读取的数据。文中涉及错误处理,确保了程序的健壮性和可用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <memory.h>
#include <stdlib.h>


#define FIFO_SEVER "/tmp/fifosever"


int main(int argc,char *argv[])
{
    int fd;
    char w_buf[4096*2];
    int real_wnum;
    
    memset(w_buf,0,4096*2);


    if((mkfifo(FIFO_SEVER,O_CREAT|O_EXCL) < 0) && (errno != EEXIST))
    {
        printf("cannt create fifosever!\n");
        exit(0);
    }
    fd = open(FIFO_SEVER,O_WRONLY|O_NONBLOCK);
    if(fd == -1)
    {
        if(errno == ENXIO)
            printf("open error,no reading process\n");
    }
    scanf("%s",w_buf);
    real_wnum = write(fd,w_buf,2048);
    if(real_wnum == -1)
    {
        if(errno == EAGAIN)
        {
            printf("write to fifo error try later!\n");
        }
    }
    else
    {
        printf("real write num is %d\n",real_wnum);
    }


    return 0;
}
### mplayer 使用有名管道和无名管道实现多进程通信 #### 有 名 管 道 (FIFO) 有名管道是一种特殊类型的文件,它允许不相关的进程之间进行通信。创建有名管道后,可以像普通文件一样打开并读数据。 对于 `mplayer` 来说,可以通过指定 `-slave` 和 `-input file=/path/to/fifo` 参数来启用从模式,并通过向 FIFO 文件发送命令来进行控制[^3]。 ```bash mkfifo /tmp/mplayer_fifo mplayer -slave -input file=/tmp/mplayer_fifo video.mp4 & echo "pause" > /tmp/mplayer_fifo ``` 这段脚本首先创建了一个名为 `/tmp/mplayer_fifo` 的有名管道,接着启动了 `mplayer` 并指定了输入源为该有名管道。最后一条命令则是向这个有名管道发送暂停指令。 #### 无 名 管 道 (Pipe) 无名管道通常用于父子进程之间的单向通信。父进程中调用 `pipe()` 创建一对连接符(两个文件描述符),其中一个是只读,另一个是只;之后再通过 `fork()` 复制当前进程上下文环境给子进程,在此过程中会复制所有的文件描述符副本到子进程中去[^1]。 下面是一个简单的例子展示如何利用 C 语言中的 pipe() 实现与 mplayer 的交互: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(){ int fd[2]; pid_t childpid; /* 创建管道 */ if(pipe(fd)==-1){ perror("pipe"); exit(1); } /* 创建子进程 */ childpid=fork(); if(childpid<0){ // 错误处理 perror("fork"); exit(1); }else if(childpid==0){ // 子进程关闭读取, 执行mplayer close(fd[0]); dup2(fd[1], STDOUT_FILENO); // 将标准输出重定向至管道 execlp("mplayer", "mplayer", "-slave", NULL); _exit(EXIT_FAILURE); } else { // 父进程关闭, 发送命令 char *command="loadfile test.avi\n"; close(fd[1]); // 关闭不需要的 write(STDOUT_FILENO, command,strlen(command)); wait(NULL); // 等待子进程结束 return EXIT_SUCCESS; } } ``` 上述程序展示了怎样建立一个无名管道并与 `mplayer` 进行基本互动。需要注意的是实际应用中可能还需要考虑错误检查和其他细节优化等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值