Linux多线程与进程之间通信 实例2

来源:互联网 发布:淘宝刷单兼职91lingla 编辑:程序博客网 时间:2024/05/18 06:10
/* ************************************************************************
* 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);
}

0 0
原创粉丝点击