扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
#include stdio.h
广丰网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站等网站项目制作,到程序开发,运营维护。创新互联公司2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。
#include stdlib.h
#include string.h
#include assert.h
int main(int argc,char *argv[])
{
int pd[2];/*用于保存管道文件描述符*/
char out[80],str[]="safasfsa";/*str是要写入的字符串,out用于保存从管道读取的字符串*/
assert(pipe(pd)!=-1);/*断言用于确定pipe()函数执行成功,如果管道创建失败,则pipe()返回-1*/
if (!fork()) write(pd[1],str,strlen(str));/*创建子进程,并将字符串写入管道*/
else {
read(pd[0],out,strlen(str));/*在主进程中从管道中读取子进程写入的字符串*/
printf("%s\n",out);/*主进程中输出。*/
}
return 0;
}
fork ----- fork ----- fork
加入进程A fork出了进程B,然后进程B又fork出了进程C,进程C又fork出了进程D
pipe是管道,只有一个入口,一个出口。可以把入口和出口分别放到父子进程中。
父进程负责读,子进程负责写。或者子进程读,父进程写。
你的例子里,在进程A里创建管道PipeA,然后fork出进程B。进程AB之间使用PipeA通信。
进程B再创建PipeB,然后进程BC之间使用PipeB通信。
进程C再创建PipeC,然后进程CD之间使用PipeC通信。
如果想把进程A的数据传递给进程D,那么应该:进程A向PipeA写入数据,进程B从PipeA中读取数据,然后再写入PipeB,进程C从PipeB中读取数据,然后再写入PipeC,进程D从PipeC中读取数据
#include stdio.h
main()
{
int i,r,p1,p2,fd[2];
char buf[50],s[50];
pipe(fd); //创建匿名管道,fd[0]为读端,fd[1]为写端
while((p1=fork())==-1); //创建子进程P1,直至成功为止(p1!=-1)
if(p1==0) //子进程P1执行逻辑
{
lockf(fd[1],1,0); //锁定管道写端,保证写入数据的完整性
sprintf(buf,"child process P1 is sending messages!\n"); //在buf中填入准备写入管道的信息数据
printf("child processP1!\n"); //打印“子进程P1正在运行”
write(fd[1],buf,50); //向管道写端fd[1]写入buf中的数据,写完后该数据即可以从读端fd[0]读出
sleep(5); //睡眠5秒
lockf(fd[1],0,0); //解锁管道写端
exit(0); //子进程P1退出
}
else //主进程的执行逻辑
{
while((p2=fork())==-1); //创建第二个子进程P2
if(p2==0) //子进程P2的执行逻辑
{
lockf(fd[1],1,0); //锁定管道写端,保证数据写入完整
sprintf(buf,"child process P2 is sending messages!\n"); //在buf中填入准备写入管道的信息数据
printf("child processP2!\n"); //打印“子进程P2正在运行”
write(fd[1],buf,50); //向管道写端fd[1]写入buf中的数据,写完后该数据即可从读端fd[0]读出
sleep(5); //睡眠5秒
lockf(fd[1],0,0); //解锁管道写端
exit(0); //子进程P2退出
}
//以下为主进程执行逻辑
wait(0); //等待某个子进程退出
if(r=read(fd[0],s,50)==-1) //从管道读端fd[0]读取P1或者P2写入的数据(视哪个子进程抢先执行到lockf函数)
{
printf(:can't read pipe\n"); //读取失败,打印错误信息
}
else
{
printf(:%s\n",s); //打印出读到的信息数据
}
wait(0); //等待第二个子进程退出
if(r=read(fd[0],s,50)==-1) //从管道读端fd[0]读取出P1或者P2写入的数据(视哪个子进程后执行到lockf函数)
{
printf(:can't read pipe\n"); //读取失败,打印错误信息
}
else
{
printf(:%s\n",s); //打印读取到的信息数据
}
exit(0); //主进程退出
}
}
总的说来,就是主进程创建了两个子进程P1、P2,这两个子进程分别向管道写入了一行文字,然后主进程从管道另一端将这两行文字读出并打印出来
由于进程的并发执行性,哪个子进程的信息先写到管道是随机的,因此该程序每次运行的输出可能并不相同,两行文字之间可能会相互交换
你没给分啊
#include stdio.h
#include string.h
#include unistd.h
#include sys/types.h
#define BUFSIZE 10
int main(int argc, char *argv[]) {
int i = 1;
int bytesin;
pid_t childpid;
int pfd[2];
if (argc 2) {
fprintf(stderr, "Usage: %s command arg1 arg2 ...\n", argv[0]);
return 1;
}
if (pipe(pfd) == -1) {
perror("Failed to create the pipe");
return 1;
}
bytesin = strlen(argv[1]);
childpid = fork();
if (childpid == -1) {
perror("Failed to fork");
return 1;
}
while (argv[i] != NULL) {
if (childpid) {
if (write(pfd[1], argv[i], strlen(argv[i])) != -1)
printf("parent write over.\n");
}else {
bytesin = read(pfd[0], argv[i], BUFSIZE);
fprintf(stderr, "[%ld]: %.*s\n", (long) getpid(), bytesin, argv[i]);
}
++i; ############关键是这里
}
return 0;
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流