#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/*1.一般来说子进程和父进程通信至少需要两条管道 一条用于读,一条用于写*/
/*2.两个进程得共享资源都不是同一个,一般来说子进程产生得时候会将所有得资源拷贝一份供子进程使用,
所以父进程和子进程得资源不是同一份*/
/*3.如果写端的管道关闭之后,那么读端的就不会阻塞了,就会继续执行下面的代码*/
/*4.如果读端的管道关闭之后,那么写端的管道会产生信号SIGPIPE*/
int main(void)
{
int fd[2];//管道得句柄//读写操作读为fd【0】 写为fd【1】不要搞混 否则会出现莫名得错误
int ret;
char buff1[1024];//读写操作
char buff2[1024];//读写操作
pid_t pd;
ret = pipe(fd);//创建管道
if (ret !=0) //创建失败
{
printf("create pipe failed!\n");
exit(1);
}
pd = fork();//创建子进程
if (pd == -1)
{
printf("fork error!\n");
exit(1);
}
else if (pd == 0)//子进程创建成功
{
bzero(buff2, sizeof(buff2));//清空字符数组
read(fd[0], buff2, sizeof(buff2));//子进程进行读操作
printf("process(%d) received information:%s\n", getpid(), buff2);
}
else //父进程执行得代码
{
strcpy(buff1, "Hello!");
write(fd[1], buff1, strlen(buff1)); //父进程进行写操作
printf("process(%d) send information:%s\n", getpid(), buff1);
}
if (pd > 0) //父进程等待子进程
{
wait();//父进程等待子进程
}
return 0;
}
demo将管道作为标准输入输出
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
int fd[2];
int ret;
char buff1[1024];
char buff2[1024];
pid_t pd;
ret = pipe(fd);//创建管道 当子进程创建时会重新复制一条管道
if (ret !=0) {
printf("create pipe failed!\n");
exit(1);
}
pd = fork();
if (pd == -1) {
printf("fork error!\n");
exit(1);
} else if (pd == 0) //这时子进程里有两条管道分别是读端和写端
{
//bzero(buff2, sizeof(buff2));
//sprintf(buff2, "%d", fd[0]);
close(fd[1]);//关闭写端
close(0);//关闭标准输入
dup(fd[0]);//复制一份读端得fd
close(fd[0]);//关闭复制的读端fd
execlp("./od.exe", "./od.exe", "-c", 0);//子进程执行另一个当前目录下的od.exe程序
printf("execl error!\n");
exit(1);
} else {
close(fd[0]);//父进程关闭读端的fd
strcpy(buff1, "Hello!");
write(fd[1], buff1, strlen(buff1)); 父进程写入数据
close(fd[1]);
}
return 0;
}
od.exe
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int ret = 0;
char buff[80] = {
0,};
ret = scanf("%s", buff);
printf("[ret: %d]buff=%s\n", ret, buff);
ret = scanf("%s", buff);//这里第二次读取输入时会失败
printf("[ret: %d]buff=%s\n", ret, buff);
return 0;
}
Linux一切皆文件 使用popen/pclose
popen的作用:
用来在两个程序之间传递数据:
在程序A中使用popen调用程序B时,有两种用法:
程序A读取程序B的输出(使用fread读取)
程序A发送数据给程序B,以作为程序B的标准输入。(使用fwrite写入)
用法:man popen
返回值:成功,返回FILE*
失败, 返回空
读
#include <stdio.h>
#include <stdlib.h>
#define BUFF_SIZE 1024
int main(void)
{
FILE * file;//文件指针
char buff[BUFF_SIZE+1];
int cnt;
// system("ls -l > result.txt");
file = popen("ls -l", "r");//打开这个程序或文件,读的方式读取 ls -l 这个程序
if (!file) {
printf("fopen failed!\n");
exit(1);
}
cnt = fread(buff, sizeof(char), BUFF_SIZE, file);//读到buff
if (cnt > 0) {
buff[cnt] = '\0';
printf("%s", buff);
}
pclose(file);//关闭这个文件
return 0;
}
在这个程序将字符写到另一程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFF_SIZE 1024
int main(void)
{
FILE * file;
char buff[BUFF_SIZE+1];
int cnt;
file = popen("./p2", "w");//当前文件下的p2程序
if (!file) {
printf("fopen failed!\n");
exit(1);
}
strcpy(buff, "hello world!");
cnt = fwrite(buff, sizeof(char), strlen(buff), file);//写到p2的程序
pclose(file);
return 0;
}