您的位置:威尼斯城vnsc登入平台 > 网络信息 > Linux进程通信(System V)第一节------>管道pipe威

Linux进程通信(System V)第一节------>管道pipe威

2019-10-17 02:39

EMFILE – 达到当前进程允许的文件描述符最大值;

#include <sys/types.h>

}

      我们可以测试:

else

       close( fd[1]);

close(fd[1]);

       n = read(fd[0], line, 100 );

if (dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO)

    if( pipe(fd_1 ) < 0)                  //!> create the pipe_1

{

#include <unistd.h>

if ((pid = fork()) < 0)

       int n =read( fd_2[0], cData, 100);      //!> 第一个pipe是父进程发送data,子进程接受data

返回值

 

if (fd[1] != STDOUT_FILENO)

       write(fd_1[1], str, strlen( str ));      //!> 第二个pipe是子进程发送data,父进程接受data

}

       num++;

return -1;

    {

-1 – 管道创建失败,同时errno置位;

 

read_count = read(fd[0], read_buffer, 500);

   

}

    printf(" on");            //!> ATTENTION  printf(" onn");

{

 

{

一.

if (pid == 0)

 

//复制fd[1]到标准输出

      原因:printf的机制是:遇到"n"就会直接输出,if没有,那么只是储存在缓存中,然后一起输出。

}

       如果是printf("on ");那么可以输出两次 on,分别是父进程和子进程输出的,但是if是printf(" on n");那么只输出一次。

描述

    if( ( pid =fork() ) < 0)               //!> false to create a new process

//close fd[1],标准输出即为fd[1]

    其他

下边的例子首先创建一个管道,然后通过fork()创建当先进程的子进程。接着每个进程关闭读写管道不需要的文件描述符。子进程在当前路径下执行“ls –a”命令,通过将管道写描述符fd[1]复制成标准输出,将命令执行输出写到管道;父进程通过fd[0]读取管道数据并显示。

      

}

      printf("n创建第一个 pipe 失败!n");

0 – 管道创建成功;

       exit( 0);

if (status == -1)

“单向pipe”:

int status = 0;

       num++;

威尼斯城vnsc登入平台 1

“双向pie”:( 可以用于CS )

函数

    int n,fd[2];            //!> fd 是描述符

pid_t pid;

    {

{

      exit(0);

//从管道读数据

 

}

      exit(0);

int pipe(int filedes[2]);

       也就是说:父进程的printf 空间缓存区也被继承!!!!!!!!!!!!!!!!!!!!!

close(fd[1]);   /* 关闭不使用的写 文件描述符 */

int main()

printf("[parent]Close write endpoint...");

 

ENFILE – 达到系统允许的打开文件的最大数;

 

EFAULT – 无效的输入参数filedes;

      printf("nFather g_num:%d    num: %dn", g_num,num);   

//父进程 读 操作

int main()

Moakap总结

 

#include <unistd.h>

#include <stdio.h>

int read_count = 0;

{

pipe()函数创建一个管道和指向该管道的一对文件描述符,并且将文件描述符存储到文件描述符数组filedes[]中。其中filedes[0]为读端,filedes[1]为写端。

    int fd_1[2],fd_2[2];                  //!> 双向 pipe 的 values、

close(fd[0]);   /* 关闭不使用的读 文件描述符 */

    int num = 0;            //!> 也是独立的~~~

return -1;

      

}

    pid_tpid;            //!> 保存的是创建的进程的 ID

#include <sys/wait.h>#include <assert.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>int main(int argc, char *argv[]){    int fd[2];

      由于是多进程编程,那么对于test.c代码而言,应该是有“子进程”和“父进程”都可以执行的!也就是说在fork后程序就是分成两部分,主进程和子进程。

return -1;

    {

printf("Fork failed.");

 

printf("Create pipe failed.");

    }

status = system("ls –a");

      g_num++;

{

    对于 pipe而言,创建 ok后,在子进程和父进程中都会有一个此管道(pipe)的读和写的接口!操作value是相同的fd[0]和fd[1]

//创建管道

    pid_tpid;

//子进程操作

#include <stdlib.h>

实例

    关于 fork函数

{

//!>

//执行命令

#include <unistd.h>

错误指示

   

}

       close(fd_1[1] );

{

 

if (pipe(fd) < 0)

//!> 单向 pipe实例   

printf("Content under current directory: n%s", read_buffer);

二.

//创建子进程

     创建两个pipe就可以了,其实也就是相当于加一个 “单向”pipe

return -1;

 

printf("[child]Close read endpoint...");

    {

char read_buffer[500] = {0};

    return0;

    }

 

       close(fd_2[0] );

      close(fd[0]);

    charline[100];            //!> 相当于是一个缓存

      //!> 子进程也需要发送 data 到 pipe

 

       getpid():获得本进程的ID

       write(fd[1],"I am your father...n", 19);

#include <stdio.h>

    {

}

    return0;

 

    if( ( pid =fork() ) < 0)      //!> 创建子进程

   

 

    }

本文由威尼斯城vnsc登入平台发布于网络信息,转载请注明出处:Linux进程通信(System V)第一节------&amp;gt;管道pipe威

关键词: