首页 \ 问答 \ linux下c语言pipe无名管道 main函数创建两个进程p1和p2,p1把一个文件名通过管道给main进程,main进程打开

linux下c语言pipe无名管道 main函数创建两个进程p1和p2,p1把一个文件名通过管道给main进程,main进程打开

linux下c语言pipe无名管道 main函数创建两个进程p1和p2,p1把一个文件名通过管道给main进程,main进程打开文件,读出内容,发给p2,p2进程打印,并将内容返回p1,p1将内容重新写入另外一个文件中
更新时间:2019-03-16 16:34

最满意答案

template
           

 
            
const T& Max(vector
            
 
  
             & vt)
{
      int max_idx=0;
      for(int i=1;i
             
  
   
               vt[max_idx])
                  max_idx = i;
     return vt[max_idx];
}

差不多就这样了,自己处理一下边界条件(比如数据为空等检查)
             
  
            
 
           
2011-09-22 回答

其他回答

你说的不太明白,你试试下面这个程序,是那个意思吗
#include
           

 
            
#include
            
 
  
             
#include
             
  
   
              
//#include
              
   
    
               
#include
               
    
     
                
#include
                
     
       #define MAXSIZE 256 void sig_info(int signo) { wait(NULL); } int main(int argc,char *argv[]) { int fin,fd[2]; if(signal(SIGCHLD,sig_info)==SIG_ERR) { perror("SIGCHLD error"); exit(EXIT_FAILURE); } if(pipe(fd)<0) { perror("pipe error"); exit(EXIT_FAILURE); } pid_t pid; if((pid=fork())<0) { perror("fork error"); exit(EXIT_FAILURE); } else if(pid==0) { //printf("in child\n"); close(fd[1]); //sleep(2); if(fd[0]!=STDIN_FILENO) { dup2(fd[0],STDIN_FILENO); } if(execl("/bin/cat","cat",(char *)0)<0) { perror("execlp error"); exit(EXIT_FAILURE); } close(fd[0]); } else { //printf("in parent\n"); close(fd[0]); if((fin=open(argv[1],O_RDONLY))<0) { perror("open error"); exit(EXIT_FAILURE); } char buffer[MAXSIZE]; int nread; //printf("in parent\n"); if((nread=read(fin,buffer,MAXSIZE))>0) { if(write(fd[1],buffer,nread)!=nread) { perror("write error"); exit(EXIT_FAILURE); } // printf("fd :%s\n",buffer); } close(fd[1]); //exit(0); //wait(NULL); } } 
     
               
    
              
   
             
  
            
 
           
2011-09-22 回答
#include 
           

 
             
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,这两个子进程分别向管道写入了一行文字,然后主进程从管道另一端将这两行文字读出并打印出来
由于进程的并发执行性,哪个子进程的信息先写到管道是随机的,因此该程序每次运行的输出可能并不相同,两行文字之间可能会相互交换
           
2011-09-22 回答
在解释延时之前先给你解释下第二个问题,p2=0xff;p0=0xff;让数码管关闭并不是因为省电,而是消隐防止有交叉重影,就像数码管先显示6然后很快的酒显示3,如果两次显示之间的间隔很短那么看起来就像是8一样,所以为了防止重影出现一般数码管动态显示都要用消隐。
现在解释延时,数码管动态显示是利用了人的视觉残留,而在动态扫描时通常会使用消隐,那么这样又时会出现一个问题,就是如果数码管亮的时间比关的时间短那么数码管看起来就会很暗,显示效果不理想,所以为了解决这个问题通常对亮的时候进行延时,让数码管亮的时间大于关的时间。
好了,希望我的解释能帮到你
2018-11-22 回答

相关问答

更多

Linux 下的C语言编程

#include&lt;stdio.h&gt; main() {int p1,p2; printf("in parent when no child\n"); system("ps -af"); while ((p1=fork())==-1); if(p1==0) {printf("hello I am the first child!\n"); printf("in child1:pid:%d,ppid:%d\n",getpid(),getppid()); system("ps -af");} ...

关于JAVA的Graphics2D画图的问题,详情见问题补充

class DrawDemo extends JFrame{ DrawDemo(){ super("简易画图工具"); this.setSize(600,600); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); Canvas ca=new Canvas(); Container c=this.getContentPane(); //c.setLayout(null); c.add(ca) ...

用LINUX C命名管道实现进程间通信的题目,已写出代码,但有一个神奇的小问题,open路径正确却有时失败?

通常管道创建的时候会出现创建不成功的情况,要在管道创建的时候就进行异常处理,如果创建不成功就重新创建,这个错误是找不到管道文件

Java 如何把if else if换成 For循环,必须使用数组

if else if 不能换成for循环。你这段代码太麻烦,而且用字符串比较不如直接比较下标,更快;重新实现一下: if(p1==p2){ drawn = drawn + 1; }else if(p1==2){// if player picked stone if(p2==0){ comWon = comWon + 1; }else{ playerWon = playerWon + 1; } }else{// if player picked paper or sci if(p1+1=p2){ ...

linux下c语言创建一个进程加载指定程序!

这跟execvp函数的实现方式有关: int execvp(const char *file ,char * const argv []); execvp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。 之所以显示“fail to exec”,是因为在PATH环境变量所指的目录中没有名为“hello”的程序。建议进行如下操作: 1、运行“ ...

linux环境下,设计两个程序,使用管道传输文件,用C语言实现(最好不要调用shell命令)

我提供的代码如下,自己补充main函数哈,希望能够帮到你:) //相关头文件: #include #include #include #include #include #include #include 发送方send: void fifo_pro() { char s[128]; int fd; FILE *fp; fp = fopen("./a.txt", "r"); mkfifo("/tmp/fifo.tst", 0644); fd = open("/tmp/fifo.tst", O_WR ...

linux下c语言创建一个进程加载指定程序!

execvp("hello",NULL) 第二个参数有问题, 试试 char *argv[]={"hello",NULL}; execvp("hello",argv)

相关文章

更多

最新问答

更多
  • 如何在webshell里面用sql语句导出一个数据库中的表段已经链接上了MYSQL 数据库123要导出的表321
  • mysql gui tools for 5.0启动提示Can't open and lock privilege tables: Can't find file: 'host' (errno
  • 我的世界java.net.Connect Exception:Connection timed out: no further information
  • PHP7 新增MySQL数据
  • 如何将SQL Server 2008的数据导出成一个SQL文件,可以在MySQL查询的。或者怎样将SQL2008转成MySQL,急急
  • 求centos5.5下安装配置Apache,php5.2,mysql5,zendoptimizer详细教程
  • 大概说明一下架设个人网站都需要什么样的准备? 需要什么样的服务器技术和服务器 ,还有需要制作PHP+MYSQL还是JSP还是其他什么?
  • mysql 安装配置失败,mysql 5.5 提示错误 last error: unable configure service
  • sql server 2008 r2中怎么给记录加上索引;远mysql中其中一个是这样定义的: KEY `UID_Idx` (`UID`)
  • php把session存储到redis中键值是:PHPREDIS_SESSION:sessionId,怎么去掉前缀PHPREDIS_SESSION
  • Windows下访问Linux下的Redis,两者能互ping,防火墙相关端口也开启,路由表也添加了,但仍无法访问
  • springside4.1的shiro+cas会陷入认证死循环,跳到cas服务器登陆后无法打开页面.Firefox提示请求循环重定
  • smart install maker 命令选项填写多个怎么执行。我要打包jdk和MySQL,但是命令选项中的脚本只有一个有效
  • 连接mysql数据库出现2003-Can't connect to MySQL server on 'localhost'(10061),请问是怎么回事?
  • com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'csdn.user' doesn't exist这什么错
  • mySql两张表的关联查询 已知两个表table1 和table2 table1有一个字段ParentID 现在要查table2 的PType1 已
  • 我这有2台centos6.3,做LNMP分离将mysql安置在另外一台服务器上,问下nginx怎么连接mysql服务器
  • 安装php configure无法通过:报错Note that the MySQL client library is not bundled anymore!
  • 打开Navicat 8.0 Lite MySQL时候出现missing required library files application
  • Eclips+Tomcat7.0+mysql5.1做博客系统,怎样连接数据库,mysql-connector-java-5.1.rar怎样安,JSP测试
  • 安装mysql 5.5.28.3 ,到check requirements时,visual studio tools for office 2010 runtime通不过。
  • tomcat6 jdk6 myeclipse6 mysql5.1 MYsql驱动也是5.1这几个匹配不啊,MYsql驱动包到底应该怎么配置啊
  • Linux(fedora)下启动MySQL,结果显示:env: /etc/init.d/mysql:权限不够。 我已经将权限切换到su了
  • win7安装教程,要很详细的那种
  • java基础教程之入门学习方法?
  • java基础教程之入门学习方法?
  • java基础教程之入门学习方法?
  • java基础教程之入门学习方法?
  • 冒险岛单机062怎么赚钱
  • mysql server instance config wizard这句话是什么意思