-
Linux创建管道
2014-08-26 19:03:53管道是两个进程的连接器,单向,一端作为输入。...创建管道函数 #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<wait.h> #include<errno.h> #inc...管道是两个进程的连接器,单向,一端作为输入。普通管道只能用于父子进程的进程间通信,命名管道可以实现不同进程间的通信。
创建管道函数
#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<wait.h> #include<errno.h> #include<signal.h> #include <setjmp.h> #include<sys/types.h> #include<fcntl.h> #include<sys/stat.h> /*int pipe(int pipefd[2]); 参数保存系统返回的描述符号,0读,1写 返回0表示成功 返回-1表示函数执行失败 */ /*首先创建了一个管道,然后创建了子进程,利用该管道从父进程向子进程发送信息。消息是程序的命令行参数,子进程收到父进程传送的消息后输出。*/ /*本例里面每个文件描述符都被关闭了两次,是因为在多进程的环境下,一个有效的管道描述符在并发子进程时会将被所有进程共享的文件表里面的引用次数+1,这里的每一次 都是将其引用计数-1在一个描述符的引用次数为0情况下才会真正的关闭一个描述符*/ int main(int argc, char *argv[]) { int pfd[2]; //保存管道的文件描述符 pid_t cpid;//保存进程标示符 char buf;//定义变量 if(argc != 2) { fprintf(stderr,"Usage: %s <string>\n",argv[0]);//提示用法信息 exit(0); } if (pipe(pfd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } cpid = fork();//创建进程 if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); } if (cpid == 0)//子进程 { close(pfd[1]);//关闭写管道描述符 while (read(pfd[0], &buf, 1) > 0)//管道循环读数据 write(STDOUT_FILENO, &buf, 1);//输出读到数据 write(STDOUT_FILENO, "\n", 1);//输出从管道里读取的数据 close(pfd[0]);//退出子进程 exit(EXIT_SUCCESS); } else { close(pfd[0]);//关闭文件描述符 write(pfd[1], argv[1], strlen(argv[1]));//向管道写入命令行参数1 close(pfd[1]);//关闭写管道描述符 wait(NULL);//等待子进程退出 exit(EXIT_SUCCESS); } return 0; }
-
在蓝色海洋中创建管道:有关如何使用Jenkins的Blue Ocean功能来创建构建应用程序的管道的入门教程-源码
2021-02-19 14:48:51在蓝色海洋中创建管道 该存储库用于中的“教程。 本教程使用的应用 所基于的 相同。 因此,尽管这次,您将完全通过Blue Ocean构建相同的应用程序。 jenkins目录包含Blue Ocean将在教程中为您创建的Jenkinsfile ... -
maya2018曲线创建管道
2020-06-09 19:46:26 -
如何创建管道——pipe
2019-02-18 17:49:45我们用pipe()函数为他们创建管道,这样他们就可以通过管道来通信了。 为了演示方便我们只考虑: 子程序把数据发送到父进程中来的情况。因此要用管道把子进程的标准输出和父进程的标准输入连接起来 我们将用pipe()...我们有一个这样的场景:主程序希望与子程序进行通信。我们用pipe()函数为他们创建管道,这样他们就可以通过管道来通信了。
为了演示方便我们只考虑:
子程序把数据发送到父进程中来的情况。因此要用管道把子进程的标准输出和父进程的标准输入连接起来我们将用pipe()函数建立管道。每当我们打开数据流时,它都会加入描述符表。pipe()函数也是如此,它创建两条相连的数据流,并把它们加到描述符表中,然后只要我们往其中一条数据流中写数据,就可以从另一条数据流中读取。pipe()在描述符表中创建这两项时,会把它们的文件描述符存放在一个包含两个元素的数组中。
int fd[2]; //文件描述符将保存在fd数组中。 if(pipe(fd) == -1){ fprintf(stderr,"Can't create the pipe!"); exit(2); }
pipe()函数创建了管道,并返回了两个描述符:fd[0]用来从管道读数据,fd[1]用来向管道写数据。我们将在父、子进程中使用这两个描述符。
我们通过一个实例来说明:
aaa.c#include <stdio.h> #include <unistd.h> #include <stdlib.h> void open_url(char *url); int main(){ int fd[2]; if(pipe(fd) == -1){ //创建管道,并把文件描述符保存在fd[0]和fd[1]中。 fprintf(stderr,"%s\n","Can't create the pipe!"); exit(1); } pid_t pid = fork(); if(pid == -1){ fprintf(stderr,"%s\n","Can't fork process!"); exit(2); } if(!pid){ //能进这里,表示已在子进程中 dup2(fd[1],1); //把标准输出设为管道写入端 close(fd[0]); //因为子进程不会去读取管道,因此将读取端关闭 if(execl("bbb","bbb",NULL) == -1){ fprintf(stderr,"%s\n","Can't open subprocess"); exit(1); } } //从这开始是属于父进程的 dup2(fd[0],0); //把标准输入设为管道读取端 close(fd[1]);//因为父进程不会向子进程发数据,无需写入管道,因此将写入端关闭 char line[255]; while(fgets(line,255,stdin)){ open_url(line+1); } return 0; } void open_url(char *url){ char launch[255]; //sprintf(launch,"cmd /c start %s",url); //在windows上打开网页 // system(launch); sprintf(launch,"x-www-browser '%s' &",url);//在Linux上打开网页 system(launch); //sprintf(launch,"open '%s'",url); //在Mac上打开网页 //system(launch); }
bbb.c
#include <stdio.h> int main(){ char line[255]; fgets(line,255,stdin); printf("%s",line); return 0; }
编译运行:
~/Desktop/MyC$ gcc aaa.c -o aaa ~/Desktop/MyC$ gcc bbb.c -o bbb ~/Desktop/MyC$ ./aaa |
查进程信息:
~$ ps -ef UID PID PPID C STIME TTY TIME CMD wong 17525 5363 0 17:47 pts/1 00:00:00 ./aaa wong 17526 17525 0 17:47 pts/1 00:00:00 bbb
输入地址按回车:
~/Desktop/MyC$ ./aaa http://www.baidu.com
接着就会打开浏览器。
管道是文件吗?这不一定。这取决于操作系统创建管道的方式,一般来说用pipe()创建的管道都不是文件。而创建基于文件的管道,通常叫做有名管道或FIFO文件(先进先出文件)。
因为基于文件的管道有名字,所以两个进程只要知道管道的名字也能用它来通信,即使它们是非父子进程关系。要使用有名管道,可以通过使用mkfifo()系统调用来实现。如果不是通过文件来实现管道的话,那通常是用内存,数据写到内存某个位置,然后再从另一个位置读取。
如果试图读取一个空的管道,也不会发生错误,因为程序会等待管道中出现东西。
父进程是如何知道子进程结束的?
其实,当子进程结束时,管道会关闭。fgets()将会收到EOF(End Of File,文件结束符) ,于是fgets()函数返回0,循环就结束了。另外,管道只能单向通信。但是可以通过创建两个管道,一个从父进程连接到子进程,另一个从子进程连接到父进程来实现双向通信 。
谢谢阅读!
-
C语言创建管道实现进程间通信
2017-10-21 11:34:55C语言创建管道实现进程间通信#include <windows.h> #include <stdio.h> #include <stdlib.h> int runcmd( char* lpCmd ) { char buf[2048] = {0}; //缓冲区 DWORD len; HANDLE hRead, hWrite; // 管道读写句柄 STARTUPINFO si; PROCESS_INFORMATION pi; SECURITY_ATTRIBUTES sa; //ZeroMemory( buf, 2047 ); sa.nLength = sizeof( sa ); sa.bInheritHandle = TRUE; // 管道句柄是可被继承的 sa.lpSecurityDescriptor = NULL; // 创建匿名管道,管道句柄是可被继承的 if( !CreatePipe( &hRead, &hWrite, &sa, 2048 ) ) { printf( "管道创建失败!(%#X)\n", (unsigned int)GetLastError() ); return 1; } ZeroMemory( &si, sizeof( si ) ); si.cb = sizeof( si ); si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdError = hWrite; si.hStdOutput = hWrite; // 创建子进程,运行命令,子进程是可继承的 if ( !CreateProcess( NULL, lpCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi ) ) { printf( "创建进程失败!(%#x)\n", (unsigned int)GetLastError() ); CloseHandle( hRead ); CloseHandle( hWrite ); return 1; } // 写端句柄已被继承,本地需要关闭,不然读管道时将被阻塞 CloseHandle( hWrite ); // 读管道内容,并显示 while ( ReadFile( hRead, buf, 2047, &len, NULL ) ) { printf( buf ); ZeroMemory( buf, 2047 ); } CloseHandle( hRead ); return 0; } int main( int argc, char** argv ) { char cmd[256]; printf( "输入命令行:" ); gets( cmd ); runcmd( cmd ); system( "pause" ); return 0; }
-
实现在任意个程序之间创建管道
2019-09-28 17:59:51实验目的: ...作用是在参数中指定的程序之间创建管道并执行这些程序 实验原理: 循环的为两个程序之间创建管道并执行前一个程序: +-------------+-------------+-------------+-------------+ | p1... -
angular创建管道
2018-04-18 18:46:101:ng g pipe pipe/multiple【目录/管道名称】 -
在共享文件夹里面创建管道mkfifo失败ubuntu
2017-04-01 09:36:00最近学到了管道,我编写的程序都是在与window的共享文件夹下保存的,以前都没问题,这次创建管道即mkfifo的时候老是提示: “MKFIFO failed : Operation not permitted” 。 原来是文件系统的问题,window的文件... -
在Gst中创建动态管道(二)_从playerbin创建管道
2008-11-05 09:30:00从playerbin创建管道make_playerbin_pipeline()基于gst中的playbin元素,playbin元素在gstplaybin.c和gstdecodebin.c中执行。在playerbin中创建动态管道的确是个棘手的任务,我了解得也不很透彻,只能尽可能解释清楚... -
PowerShell中使用Filter来创建管道输入函数
2021-01-20 16:29:31Filter可以快速的创建一个管道输入函数,Filter就相当于只有一个Process块的Function。 Filter关键词可以代替Function关键词来创建函数。但Filter创建的函数,只能是接收管道输入参数的参数,并且是接收块结构数据的... -
mkfifo 创建管道IO 进程间交互
2013-03-28 13:13:02mkfifo 创建管道IO 一.程序: 1) 接收程序: [user:lib_hdmanage] cat example/rec.cpp #include #include #include #define FIFO "disk_switch" int main() { char buffer[80]; int fd = 0; ... -
LINUX创建管道文件
2019-10-09 05:28:15创建管道文件 mkfifo 1.pipe Makefile a:a.c b.c gcc a.c -o a gcc b.c -o b .PHONY:clean clean: rm a b ... -
安卓系统中在jni中写mkfifo创建管道为什么不成功啊!!!
2016-07-21 10:28:33安卓系统中在jni中写mkfifo创建管道为什么不成功,返回值为-1. -
重定向、管道命令、创建管道
2017-04-15 15:30:21---- pipe命令创建管道 #include #include #include #include int main() { pid_t tpid; int nfd[2]; char achbuf[256] = { 0 }; char* pchw = "hello world\n"; int nRet = -1; nRet = pipe(nfd);//调用成功返回0... -
Golang | 快速创建管道案例
2020-07-03 18:01:10// 演示一个可以存放3个int类型的管道 var intChan chan int intChan = make(chan int, 3) // 查看intChan是什么 fmt.Printf("intChan 的值是=%v , intChan 自己本身的地址是= %p \n", intChan, &intChan)... -
网页3D编辑器Stone教程:如何创建管道模型
2020-11-06 12:13:31使用踏得网的Stone工具可以轻松创建一个管道。 首先创建一个曲线(Spine)实体,从左侧工具栏中选择并点击“曲线”菜单: 这时场景当前选中实体下将出现一个曲线模型: 该曲线模型默认情况下有4个控制节点,... -
Linux系统中mkfifo创建管道后,调用open打开失败,不知道错在哪儿
2016-12-14 11:32:26原文地址::... 相关文章 1、linux下为什么创建管道成功,打开管道却失败呢----https://zhidao.baidu.com/question/454079361.html 进程间通信之FIFO,在阻塞模式下,只有当读和 -
Linux下创建管道文件,并实现两个进程间的信息传递。
2014-06-21 00:13:34第一步创建管道文件:fifo.c #include #include #define PATH "/home/bencai/4-4/swap" int main(int *argc,char **argv) { int ret; ret=mkfifo(PATH,0644); if(ret!=0) { ... -
VC++ 创建管道
2009-11-05 16:49:00void CDlgTestDlg::OnBnClickedOk(){ SECURITY_ATTRIBUTES sa; HANDLE hRead,hWrite; sa.nLength=sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle=TRUE; if(!CreatePipe(&hRead,&hWrite,&sa,0)) -
进程间通信-创建管道实现机制
2017-08-07 17:06:17对于每个管道来说,内核都要创建一个索引节点对象和两个文件对象,一个文件对象用于读,一个文件对象用于写。当进程希望从管道中读取数据或向管道中写入数据时,必须使用适当的文件描述符。在 linux 中,管道的实现... -
如何创建管道啊
2013-04-16 17:29:09如何创建管道啊,管道是什么 -
/*创建管道*/ if(pipe(pipe_fd))
2012-09-28 10:50:45#include #include #include #include #include #include int main() { int pipe_fd[2]; pid_t pid; char buf_r[100]; char* p_wbuf; int r_num; memset(buf_r,0,sizeof(buf_r))... /*创建管道*/ if(pi -
【VLC】创建管道
2013-11-27 10:56:29src/posix的filesystem.c中 /** * Creates a pipe (see "man pipe" for further reference). */ int vlc_pipe (int fds[2]) { #ifdef HAVE_PIPE2 if (pipe2 (fds, O_CLOEXEC) == 0) return 0;... -
Revit二次开发--创建管道
2018-12-29 17:20:59下面是使用第三种重载方法创建的一条立管: public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIDocument uiDoc = commandData.Application.... -
linux c之通过popen和pclose函数创建管道执行shell 运行命令使用总结
2017-02-14 15:32:25标准 I/O 库提供了两个函数popen 和 pclose 函数,这两个函数实现的操作是:创建一个管道,调用 fork 创建一个子进程,关闭管道的不使用端,执行一个 shell 以运行命令,然后等待终止。 API /* popen 和 pc -
Revit2014 支持编程创建管道并且立即赋予系统类型名称
2013-11-25 15:21:36在Revit2013里面,当我们用NewPipe创建完成一个管道后,若这个管断是独立的没有与其它已经具有系统类型的管道或终端设备连接,这个管段的系统类型属性是没有定义的。通过编程也无法赋予系统类型。 这个问题已经办法...
-
QtXlsx 完美读写Excel 跨平台 免安装Office 附带很多优美示例
-
在线课堂Web无插件直播点播系统EasyDSS如何接入第三方视频管理平台EasyNVS?
-
5-8预备党员转正公示情况表.doc
-
python tornado get_query_argument()
-
Postman-win64-8.0.6-Setup.zip
-
MySQL 高可用工具 heartbeat 实战部署详解
-
MySQL DML 语言(插入、更新与删除数据)
-
Ubuntu 20.04 Server 使用命令行设置 IP 地址
-
正常人骨髓来源间充质 干细胞 Mesenchymal stem cells
-
Cal-RIPA-源码
-
5-7预备党员转正公示(范例).doc
-
libFuzzer视频教程
-
线性调频信号的模糊函数matlab代码—LFM_AF.m
-
NFS 实现高可用(DRBD + heartbeat)
-
实现 MySQL 读写分离的利器 mysql-proxy
-
nginx 把nginx添加为系统服务的文件
-
Tcpview工具.zip
-
精通编译Makefile,Nina, 从底层uboot到Android
-
2021-03-04论文中affinity的含义及理解
-
5-9支部大会会议纪录(首页).doc