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

本文详细介绍了在C语言环境下利用管道、fork函数和信号处理实现进程间通信,以及如何通过多线程并发处理文件操作,特别关注了wget命令的集成与优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* ************************************************************************
* 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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值