说明如何实现父子进程之间的同步的,#include <stdio.h> #include <sys/types.h> #include <stdlib.h> #include <sys/stat.h> #include <fcntl.h> #include <error.h> #include <wait.h> #include <unistd.h> int main( ){ int pid1,pid2,pid3; int fd[2]; char outpipe[60],inpipe[60]; pipe(fd);//创建一个管道 while ((pid1=fork( ))==-1); printf("pid1=%d\n",pid1); if(pid1==0){ printf("The Child process 1 is sending message!\n"); lockf(fd[1],1,0);//互斥 sprintf(outpipe,"This is the child 1 process's message!\n"); write(fd[1],outpipe,60); sleep(1);//自我阻塞1秒,让出机会执行下一个进程,增加并发度 lockf(fd[1],0,0); exit(0); } else{ while((pid2=fork( ))==-1); printf("pid2=%d\n",pid2); if(pid2==0){ printf("The Child process 2 is sending message!\n"); lockf(fd[1],1,0); sprintf(outpipe,"This is the child 2 process's message!\n"); write(fd[1],outpipe,60); sleep(1); lockf(fd[1],0,0); exit(0); } else{ while((pid3=fork( ))==-1); printf("pid3=%d\n",pid3); if(pid3==0){ printf("The Child process 3 is sending message!\n"); lockf(fd[1],1,0); sprintf(outpipe,"This is the child 3 process's message!\n"); write(fd[1],outpipe,60); sleep(1); lockf(fd[1],0,0); exit(0); } else{ wait(0);//同步 read(fd[0],inpipe,60); printf("\n%s",inpipe); wait(0); read(fd[0],inpipe,60); printf("%s\n",inpipe); wait(0); read(fd[0],inpipe,60); printf("%s\n",inpipe); exit(0); } } } return 0; }
时间: 2024-03-30 12:37:29 浏览: 47
在这个程序中,父进程通过创建三个子进程并使用管道进行通信,实现了父子进程之间的同步操作。具体实现方法如下:
首先,父进程在创建三个子进程之前创建了一个管道,并将其用于子进程之间的通信。
接着,父进程创建了三个子进程,每个子进程都会执行以下操作:
1. 使用 lockf 函数进行互斥锁,确保每个子进程都能独占写入管道的操作,避免产生竞争条件。
2. 将子进程要发送的信息写入管道中。
3. 自我阻塞一秒钟,让出 CPU 资源,从而增加并发度。
4. 使用 lockf 函数释放互斥锁。
5. 子进程退出。
最后,父进程使用 wait 函数等待三个子进程都执行完毕,然后依次从管道中读取子进程发送的信息,并输出到屏幕上。
通过这种方式,父子进程之间就能够实现同步操作,确保各个子进程的执行顺序和输出顺序都能够正确无误。
相关问题
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int main() { pid_t pid; pid = fork(); if (pid < 0) { perror("fork fail\n"); exit(-1); } else if ( pid == 0 ) // 子进程1 { printf("b\n"); sleep(5); exit(0); } else { printf("a\n"); // 父进程 waitpid(pid,NULL,0); printf("my son has exit!\n"); exit(0); } }的waitpid(pid,NULL,0)有什么用
waitpid(pid,NULL,0)是父进程等待子进程结束的一种方式。其中,pid是子进程的进程ID,NULL表示不需要获取子进程的结束状态,0表示等待任何子进程结束。
在该代码中,父进程通过waitpid函数等待子进程结束,以确保子进程在父进程之前结束。如果不等待子进程结束,父进程可能会在子进程之前退出,导致子进程变成孤儿进程,从而由init进程接管,造成资源浪费和系统性能降低。
因此,使用waitpid函数可以保证父子进程的正确协同执行。
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include<stdlib.h> int main () { int pid;int fd[2];char S[20];pipe (fd) ;pid=fork (); if(0==pid){ int i=0 ; for (;i<10; i++){ sprintf(S,"Hello,No %d ",i);write(fd[1],S,20) ; sleep (1);} exit (0) ; } else { int i=0 ; for ( ;i<10; i++){ read (fd[0],S,20);printf ("%s",S);sleep (1);} exit (0) ; } }
这是一个用 C 语言写的管道通信程序。程序中使用了系统调用函数 pipe、fork、read、write、sleep 和 exit。
程序的功能是创建一个管道,然后通过 fork 函数创建一个子进程。子进程会向管道中写入 10 条字符串,每隔 1 秒写入一次。父进程则从管道中读取数据,并打印出来,也是每隔 1 秒读取一次。
需要注意的是,管道是一种半双工的通信方式,所以程序中创建了两个文件描述符:fd[0] 用于读取管道数据,fd[1] 用于写入管道数据。同时,父子进程中都需要关闭不需要的文件描述符,以避免资源浪费和出现意外情况。
阅读全文