您的位置:首页 > 运维架构 > Linux

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: