Linux多线程与进程之间通信 实例2
2016-03-05 17:27
691 查看
/* ************************************************************************
* Description: main.c
* Version: 1.0
* Revision: none
* Compiler: gcc
* Company:
* ************************************************************************/
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
static void sig_child(int signo);
pthread_mutex_t Device_mutex ;
int main(int argc, char *argv[])
{
pid_t fpid; //fpid表示fork函数返回的值
int pipefd[2],result;
result= pipe(pipefd);//创建一个管道[0]read [1]write
if(result==-1)
{
perror("pipe error:");
exit(1);
}
fpid=fork();
if (fpid == 0)
{
char nfile[512]="";
close(pipefd[1]);
while(1)
{
int read_fd=pipefd[0];
int nbytes=0;
pid_t prs;
memset(nfile,0,sizeof(nfile));
nbytes=read(read_fd,nfile,sizeof(nfile));
if(nbytes<0)
{
printf("\n\n\n****2**end fork()****\n");
exit(1);
}
else if((nbytes<5)||(strstr(nfile,".txt")==NULL))
{
sleep(1);
continue;
}
//printf("nfile=%s\n",nfile);
fpid=fork();
if(fpid==0)
{
char arg[100]="";
//http://192.168.0.111:8080
sprintf(arg,"http://192.168.0.111:8080/SSL_001_0226/files/%s",nfile);
printf("\n\n\narg=%s nfile=%s\n",arg,nfile);
if( execlp("wget", "wget","-c","-O",nfile, arg, NULL ) < 0 )
{
perror( "execlp error " );
exit(1);
}
}
else if(fpid>0)
{
prs = wait(NULL); /* 在这里等待子进程结束 */
if ( prs > 0 ) /*子进程正常返回*/
{
// printf("I catched a child process with pid of %d\n", prs);
}
}
else
{
printf("error in fork!");
}
printf("****while1**end fork()****\n\n\n\n");
}
}
else if(fpid>0)
{
pthread_t tid;
//char fileNew[40]="";
int write_fd=pipefd[1];
close(pipefd[0]);
printf("write_fp=%d\n", write_fd);
pthread_mutex_init(&Device_mutex,NULL);
//write(write_fd, fileNew, strlen(fileNew)+1);//具体写多少个字节
//接收消息线程,接收协调器发送的数据
pthread_create(&tid, NULL, recv_zigbee_thread, &write_fd);
//与TCP服务器通信,上报每个节点的属性值
pthread_create(&tid, NULL, tcp_client_thread, &write_fd);
//主线程不能退出
pthread_join(tid, NULL);
printf("!!!end parent jing cheng\n");
}
else
{
}
printf("\n\n\n\\n\n\n\n\n......end of main......\n\n\n\n\n\\n\n");
return 0;
}
static void sig_child(int signo)
{
pid_t pid;
int stat;
//处理僵尸进程
while ((pid = waitpid(-1, &stat, WNOHANG)) >0)
printf("child %d terminated.\n", pid);
}
* Description: main.c
* Version: 1.0
* Revision: none
* Compiler: gcc
* Company:
* ************************************************************************/
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
static void sig_child(int signo);
pthread_mutex_t Device_mutex ;
int main(int argc, char *argv[])
{
pid_t fpid; //fpid表示fork函数返回的值
int pipefd[2],result;
result= pipe(pipefd);//创建一个管道[0]read [1]write
if(result==-1)
{
perror("pipe error:");
exit(1);
}
fpid=fork();
if (fpid == 0)
{
char nfile[512]="";
close(pipefd[1]);
while(1)
{
int read_fd=pipefd[0];
int nbytes=0;
pid_t prs;
memset(nfile,0,sizeof(nfile));
nbytes=read(read_fd,nfile,sizeof(nfile));
if(nbytes<0)
{
printf("\n\n\n****2**end fork()****\n");
exit(1);
}
else if((nbytes<5)||(strstr(nfile,".txt")==NULL))
{
sleep(1);
continue;
}
//printf("nfile=%s\n",nfile);
fpid=fork();
if(fpid==0)
{
char arg[100]="";
//http://192.168.0.111:8080
sprintf(arg,"http://192.168.0.111:8080/SSL_001_0226/files/%s",nfile);
printf("\n\n\narg=%s nfile=%s\n",arg,nfile);
if( execlp("wget", "wget","-c","-O",nfile, arg, NULL ) < 0 )
{
perror( "execlp error " );
exit(1);
}
}
else if(fpid>0)
{
prs = wait(NULL); /* 在这里等待子进程结束 */
if ( prs > 0 ) /*子进程正常返回*/
{
// printf("I catched a child process with pid of %d\n", prs);
}
}
else
{
printf("error in fork!");
}
printf("****while1**end fork()****\n\n\n\n");
}
}
else if(fpid>0)
{
pthread_t tid;
//char fileNew[40]="";
int write_fd=pipefd[1];
close(pipefd[0]);
printf("write_fp=%d\n", write_fd);
pthread_mutex_init(&Device_mutex,NULL);
//write(write_fd, fileNew, strlen(fileNew)+1);//具体写多少个字节
//接收消息线程,接收协调器发送的数据
pthread_create(&tid, NULL, recv_zigbee_thread, &write_fd);
//与TCP服务器通信,上报每个节点的属性值
pthread_create(&tid, NULL, tcp_client_thread, &write_fd);
//主线程不能退出
pthread_join(tid, NULL);
printf("!!!end parent jing cheng\n");
}
else
{
}
printf("\n\n\n\\n\n\n\n\n......end of main......\n\n\n\n\n\\n\n");
return 0;
}
static void sig_child(int signo)
{
pid_t pid;
int stat;
//处理僵尸进程
while ((pid = waitpid(-1, &stat, WNOHANG)) >0)
printf("child %d terminated.\n", pid);
}
相关文章推荐
- CentOS6.5 64位安装单机版hadoop2.6教程
- Linux3.5内核以后的路由下一跳缓存
- linux搭建nfs服务器
- 20135327郭皓——Linux内核分析第二周 操作系统是如何工作的
- Linux 多线程与进程间通信 实例 1
- CentOS 6.7下Android SDK adb 命令报错的解决方法
- linux下Eclipse安装启动后报错
- Linux
- Linux异步信号处理函数引发的死锁及解决方法
- Linux的运行级别和chkconfig用法
- Linux之解析鼠标input事件数据(有BUG,已经解决)
- Linux基础知识(三)
- Linux cloc
- 关于centos7中使用rpm方式安装mysql5.7版本后无法使用root登录的问题
- [国嵌攻略][104][Linux内核模块设计]
- [国嵌攻略][103][Linux内核模块基础]
- linux内核分析之-进程管理
- Linux rpm 命令参数使用详解[介绍和应用]
- centos下的svn服务器搭建过程以及分析
- Linux命令大全