进程有独立的用户内存地址,
进程的全局变量对其它进程透明,
需通过内核缓冲内共享数据,通信
管道: 声明在unistd.h头文件中
原型 int pipe(int filedes[2]); filedes[0]表示输入管道,filedes[1]表示输出管道. 返回值:0表示创建管道成功,-1为失败/
代码测试:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> int main(int argc,char* argv[]) { int fd[2]; pipe(fd);//创建管道 pid_t pid = fork();//生成子进程 if(pid < 0){ perror("fork failed"); exit(1); } else if( pid >0){ close(fd[0]);//父进程关闭输入管道 write(fd[1],"hello child\n",12);//子进1向输出管道写入数据 wait(NULL); }else{ close(fd[1]);//子进程关闭输出管道 char buf[50]; read(fd[0],buf,12); //printf("%s",buf); write(STDOUT_FILENO,buf,12);//此处也可以用dup2,将信息输出到终端 } return 0; }
如果想让子进程作为输出,父进程作为输出,可以使用wait(NULL) /wait(pid.....)让父进程处于阻塞状态,直到子进程完成输出.父 进程接收到signal后苏醒进行读取.在这里我没有过多的考虑PV操作了,可能会存在一些同步的问题,以后会进一步完善.
两个子进程间通信也是差不多的.
代码:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> int main(int argc,char* argv[]) { int fd[2]; pipe(fd); pid_t pid = fork(); if(pid < 0){ perror("fork failed"); exit(1); } else if( pid >0){ pid_t pidt = fork(); if(pidt == 0){ close(fd[0]); write(fd[1],"hello borther\n",14); } }else{ close(fd[1]); char buf[50]; read(fd[0],buf,14); //printf("%s",buf); write(STDOUT_FILENO,buf,12); } return 0; }