通过管道与子进程通信
转载时请注明出处:http://blog.csdn.net/absurd/
最近要把mplayer改造成C/S架构的,mplayer比较复杂,为了避免修改mplayer的代码,我决定让mplayer作为Server的子进程来运行,两者之间用管道作为通信方式。通过管道与子进程通信实现很简单,但从来没有用过,还是折腾了好一会儿才搞定,这里做个笔记,供以后查阅。
parent.c
#include <unistd.h>
int main(int argc, char* argv[])
{
int parent_to_child[2] = {0};
int child_to_parent[2] = {0};
pipe(parent_to_child);
pipe(child_to_parent);
if(fork() == 0)
{
close(parent_to_child[1]);
close(child_to_parent[0]);
dup2(parent_to_child[0], STDIN_FILENO);
dup2(child_to_parent[1], STDOUT_FILENO);
execl("./child.exe", "./child.exe", NULL);
}
else
{
char message[32] = {0};
close(parent_to_child[0]);
close(child_to_parent[1]);
fprintf(stderr, "parent:%d/n", getpid());
while(1)
{
write(parent_to_child[1], "to-c", 4);
read(child_to_parent[0], message, 4);
fprintf(stderr, "pid=%d: %s/n", getpid(), message);
if(strcmp(message, "quit") == 0)
{
break;
}
}
}
return 0;
}
|
child.c
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
int i = 0;
char message[32] = {0};
fprintf(stderr, "child:%d/n", getpid());
for(i = 0; i < 8; i++)
{
write(STDOUT_FILENO, "to-p", 4);
read(STDIN_FILENO, message, 4);
fprintf(stderr, "pid=%d: %s/n", getpid(), message);
}
write(STDOUT_FILENO, "quit", 4);
return 0;
}
|
Makefile
ll:
gcc -g parent.c -o parent.exe
gcc -g child.c -o child.exe
clean:
rm -f *.exe
|
运行测试
[root@localhost pipe]# ./parent.exe
parent:3058
child:3059
pid=3058: to-p
pid=3059: to-c
pid=3058: to-p
pid=3059: to-c
pid=3058: to-p
pid=3059: to-c
pid=3058: to-p
pid=3059: to-c
pid=3058: to-p
pid=3059: to-c
pid=3058: to-p
pid=3059: to-c
pid=3058: to-p
pid=3059: to-c
pid=3058: to-p
pid=3059: to-c
pid=3058: quit
分享到:
相关推荐
编程高手 笔记 通过管道与子进程通信 编程高手 笔记 通过管道与子进程通信 编程高手 笔记 通过管道与子进程通信 编程高手 笔记 通过管道与子进程通信
操作系统课程作业(本人亲自研究写出) 学习利用管道机制实现进程间的通信,加深对通信机制的理解。 实验内容: ...c) 父进程调用函数read()通过管道读出子进程发来的消息,将消息输出屏幕,然后终止
进程的管道通信 编制一段程序,实现进程的管道通信,使用系统调用pipe()建立一个管道文件;两个子进程P1和P2 分别向管道各写一句话: ...要求父进程先接收子进程P1发来的 消息,然后再接收子进程P2发来的消息。
父进程在屏幕上显示“Parent”,子进程分别在屏幕上显示“Child1”和“Child2”。 如果在程序中使用系统调用lockf()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。 要求:使用系统调用fork()...
创建子进程P1 P2 … 子进程Pi分别向管道各写信息 而父进程则从管道中读出来自于各子进程的信息 实现进程家族间无名管道通讯 扩展之 使之成为客户 服务器模式 并完成一定的任务(自己定义) 2 命名管道通信:利用...
任务1:使用Pipe创建管道,创建一个子进程,子进程向父进程发送消息“I am your son!”,父进程接收到子进程的消息后,显示在屏幕上,并向子进程发送“I am your father!”。子进程接收到父进程的消息并显示在屏幕上...
《进程通信之三 父进程传参数与子进程返回值》 http://blog.csdn.net/morewindows/article/details/8683830 配套程序。本篇介绍一个简单而又实用的进程通信方式——父进程向子进程传入参数并获取子进程返回值。这个...
使用无名管道完成进程间通信,进入主函数我们需要先打开无名管道,如果失败则返回失败信息。
管道实现进程间的通信,是通过无名管道来实现的,父进程写入命令,子进程读出并执行
计算机操作系统实验三,掌握计算机进程的管道通信
进程的管道通信 1)使用系统调用pipe()建立一条管道,系统调用fork()分别创建两个子...5) 实现父子进程的同步,当父进程试图从一空管道中读取数据时,便进入等待状态,直到子进程将数据写入管道返回后,才将其唤醒。
父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。 1、通过本实验,我了解管道是指能够连接一个写进程和一个读进程的、并允许它们以生产者—消费者方式进行通信的一个共享文件,又称为pipe...
使用系统调用pipe()建立一个管道,两个子进程分别向管道写信息,父进程则从管道读出来自子进程的信息,显示在屏幕上,记录屏幕的显示结果,分析原因。 任务 编制一段程序,实现进程的管道通信。使用系统调用pipe()...
操作系统实验完整报告 在Linux系统中使用系统调用fork()创建两个子进程,使用系统调用pipe()建立一个管道,两个子进程分别...1.父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。 2.在Linux平台下实现。
进程的管道通信实验 操作系统 课程设计 大家看看 好的顶啊
使用系统调用pipe()建立一个管道,两个子进程分别向管道写信息,父进程则从管道读出来自子进程的信息,显示在屏幕上,记录屏幕的显示结果,分析原因。 任务 编制一段程序,实现进程的管道通信。使用系统调用pipe()...
1.父进程创建管道和两个子进程p1和p2 2.子进程p1打开给定文件(如果没有,则创建文件),并向文件中写数据,...3.子进程p2通过管道读取消息,如果消息是“ok”,则打开文件,读取文件内容,并将其输出到屏幕上,关闭文件.
父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。 程序部分: #include #include #include int pid1,pid2; main( ) { int fd[2]; char outpipe[100],inpipe[100]; pipe(fd); /*创建...
2) wait() 常用来控制父进程与子进程的同步。 在父进程中调用wait(),则父进程被阻塞,进入等待队列,等待子进程结束。当子进程结束时,父进程从wait()返回继续执行原来的程序。 返回值:大于0时,为子进程的ID值;...
1、了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C...父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。 自己改后可以运行出来,希望有帮助。