1.通过管道实现父进程向子进程发送消息
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h> /*pipe function read/write*/
#include<sys/types.h> /*pid_t */
int main()
{
int fd[2];
int *write_fd;
int *read_fd;
pid_t pid;
int nbytes=0;
int result=-4;
char string[]="hello!pipe!";
char readbuffer[80];
result=pipe(fd);
write_fd=&fd[1];
read_fd=&fd[0];
pid=fork();
if(pid==-1)
{
printf("fork failed!");
return 0;
}
if(pid==0)
{
close(*write_fd);
nbytes=read(*read_fd,readbuffer,sizeof(readbuffer));
printf("receive %d data,the content is:%s",nbytes,readbuffer);
}
else
{
close(*read_fd);
result=write(fd[1],string,strlen(string));
}
return 0;
}
2.pipe函数
pipe(建立管道):
头文件 #include<unistd.h>
定义函数: int pipe(int filedes[2]);
函数说明:pipe()会建立管道,并将文件描写叙述词由參数filedes数组返回。
filedes[0]为管道里的读取端
filedes[1]则为管道的写入端。
返回值: 若成功则返回零,否则返回-1,错误原因存于errno中。
错误代码:
EMFILE 进程已用完文件描写叙述词最大量
ENFILE 系统已无文件描写叙述词可用。
EFAULT 參数 filedes 数组地址不合法。
3.read和write函数
#include <unistd>
ssize_t write(int filedes, void *buf, size_t nbytes);
// 返回:若成功则返回写入的字节数,若出错则返回-1
// filedes:文件描述符
// buf:待写入数据缓存区
// nbytes:要写入的字节数
#include <unistd>
ssize_t read(int filedes, void *buf, size_t nbytes);
// 返回:若成功则返回读到的字节数,若已到文件末尾则返回0,若出错则返回-1
// filedes:文件描述符
// buf:读取数据缓存区
// nbytes:要读取的字节数