白鱼儿的迷之理解:
干事情呢,首先打起大的框架,然后从大到小,慢慢的把细节实现。
首先明白无名管道是一种特殊的文件,所以许多对文件操作的函数都可以用(read write)
然后这个文件呢特点就是单双工的,它是父系社会只能爸爸和孩子用
函数:
int pipe(int file[2]) file[0]是读 file[1]是写
pid_t fork(void) 返回值是0是子进程,大于0的是父进程,小于零是出错的
例子:
man了一下,有用法,要去忙项目了
编程顺序:
(1)创建管道
(2)创建子进程
(3)进行读写操作
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
int pipefd[2];
pid_t cpid;
char buf;
if(argc != 2) {
fprintf(stderr, "Usage: %s <string>\n", argv[0]);
exit(EXIT_FAILURE);
}
if(pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
cpid = fork();
if(cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if(cpid == 0) { /* Child reads from pipe */
close(pipefd[1]); /* Close unused write end */
while (read(pipefd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);
write(STDOUT_FILENO, "\n", 1);
close(pipefd[0]);
_exit(EXIT_SUCCESS);
}else { /* Parent writes argv[1] to pipe */
close(pipefd[0]); /* Close unused read end */
write(pipefd[1], argv[1], strlen(argv[1]));
close(pipefd[1]); /* Reader will see EOF */
wait(NULL); /* Wait for child */
exit(EXIT_SUCCESS);
ps:
-
1.线程间通信可不可以用管道?
答:没必要,线程间通信在同一进程中,可以共享资源,注意资源互斥等问题就好