使用pthread线程库,
编译时 gcc *.c -lpthread
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <io.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <pthread.h>
#include <sys/stat.h>
#include <stdio.h>
#include <signal.h>
#include <sys/syscall.h>
#include "qsock.c"
#define toolsvr_port 9000
int msgid;
char* volumestr="1";
char *invalidstr="invalidstr";
char wordptr[100];
int msgbufptr;
#define msg_len 250
char *getwordbyspace(char *s)
{
int len,ptr;
len=strlen(s)+1;
if(len>msg_len) len=msg_len;
wordptr[0]=0;
ptr=0;
while(1)
{ if(msgbufptr>len) return(wordptr);
if(s[msgbufptr]==0) return(wordptr);
if(s[msgbufptr]!=' ')
{
break;
}
msgbufptr++;
};
wordptr[ptr]=s[msgbufptr];
ptr++;
msgbufptr++;
while(1)
{ if(msgbufptr>len) break;
if(s[msgbufptr]==0) break;
if(s[msgbufptr]==' ')
{
msgbufptr++;
break;
}
wordptr[ptr]=s[msgbufptr];
ptr++;
msgbufptr++;
};
wordptr[ptr]=0;
//printf("word:%s\",wordptr);
return(wordptr);
}
pid_t qpid=0;
void setalarm(pid_t pid)
{ qpid=pid;
alarm(10);
};
void printfile(char *fname)
{
int ret;
pid_t pid;
int status;
char buf[200];
pid=fork();
if(pid==0)
{
ret=execl("./printfile","printfile",fname,null);
if(ret!=0)
{ perror("printfile");
exit(1);
}
exit(0);
};
setalarm(pid);
while((pid=wait(&status))>0)
printf("child %d died,exit code %d\",pid,status);
printf("print file %s\",fname);
qpid=0;
};
void capturefile(char *fname)
{
int ret;
pid_t pid;
int status;
int handle;
char buf[200];
remove("captured");
sprintf(buf,"-f %s",fname);
printf("param=%s\",buf);
pid=fork();
if(pid==0)
{
ret=execl("./videodog","videodog","-f",fname,"-j","-x","640","-y","480","-w","3","-d","/dev/video0",null);
if(ret!=0)
{ perror("videodog");
exit(1);
}
exit(0);
};
setalarm(pid);
while((pid=wait(&status))>0)
printf("child %d died,exit code %d\",pid,status);
qpid=0;
printf("capture file %s\",fname);
handle=open("captured",o_creat|o_rdwr,438);
if(handle<0)
{ printf("cannot create captured");
return;
}
close(handle);
};
void setdate(char *str)
{
int ret;
pid_t pid;
int status;
pid=fork();
if(pid==0)
{
ret=execl("date","date",str,null);
if(ret!=0)
{ perror("date");
exit(1);
}
exit(0);
};
setalarm(pid);
while((pid=wait(&status))>0)
printf("child %d died,exit code %d\",pid,status);
qpid=0;
pid=fork();
if(pid==0)
{
ret=execl("hwclock","hwclock","--systohc","--directisa",null);
if(ret!=0)
{ perror("hwclock");
exit(1);
}
exit(0);
};
setalarm(pid);
while((pid=wait(&status))>0)
printf("child %d died,exit code %d\",pid,status);
qpid=0;
};
void playfile(char *fname)
{
int ret;
pid_t pid;
int status;
pid=fork();
if(pid==0)
{
ret=execl("./wavplay","wavplay",fname,"-v",volumestr,"-s","66000",null);
if(ret!=0)
{ perror("wavplay");
exit(1);
}
exit(0);
};
setalarm(pid);
while((pid=wait(&status))>0)
printf("child %d died,exit code %d\",pid,status);
qpid=0;
};
void removeoldfile(char *s)
{ int len=0;
char s1[100],s2[100];
int i,j,k,sid;
long transid,otransid;
strcpy(s1,s);
len=strlen(s1);
j=0;
for(i=0;i<len;i++)
{ if(s1[i]=='.') break;
s2[j]=s1[i];
j++;
};
if(j<=0) return;
s2[j]=0;
sid=strtol(s2,null,10);
k=j+1;
j=0;
for(i=k;i<len;i++)
{
if(s1[i]=='.') break;
s2[j]=s1[i];
j++;
};
if(j<=0) return;
s2[j]=0;
transid=strtol(s2,null,10);
printf("sid=%d,transid=%ld\",sid,transid);
otransid=transid-100;
if(otransid<=0) return;
sprintf(s1,"%d.%ld.jpg",sid,otransid);
printf("old file=%s\",s1);
remove(s1);
};
int loopflag;
char soundfilename[100];
#define pthread_attr_default 0
#define pthread_mutexattr_default 0
pthread_mutex_t mutex;
pthread_t playloop;
time_t playtime;
void playfile_loop()
{
while(1)
{
pthread_mutex_lock( &mutex );
if(loopflag==1)
if((time(null)-playtime)>2) loopflag=2;
if(loopflag==2)
playfile(soundfilename);
pthread_mutex_unlock( &mutex );
sleep(3);
};
};
void executefile(char *fname);
static void qtimeout(int sig)
{
printf("pid %d timeout\",qpid);
if(qpid>0) kill(qpid,sigterm);
};
int main(int argc,char **argv)
{
char msgbuf[256];
char *ptr;
int len,c;
pthread_mutex_init(&mutex, pthread_mutexattr_default);
pthread_create( &playloop, pthread_attr_default, (void*)&playfile_loop,
null);
signal(sigalrm, qtimeout);
strcpy(soundfilename,"");
loopflag==0;
msgid=opensocket_serverudp(toolsvr_port);
set2block(msgid);
opterr=0;
while((c=getopt(argc,argv,"v:"))!=-1)
{
switch(c)
{
case 'v':
volumestr=optarg;
break;
};
}
while(1)
{
printf("start recv\");
len=recv(msgid,msgbuf,msg_len,0);
if(len<=0) continue;
msgbuf[len]=0;
printf("msg=%s\",msgbuf);
msgbufptr=0;
ptr=getwordbyspace(msgbuf);
if(strcmp(ptr,"play")==0)
{ ptr=getwordbyspace(msgbuf);
pthread_mutex_lock( &mutex );
playfile(ptr);
playtime=time(null);
loopflag=0;
strcpy(soundfilename,ptr);
ptr=getwordbyspace(msgbuf);
if(strcmp(ptr,"loop")==0) loopflag=1;
pthread_mutex_unlock( &mutex );
}
else if(strcmp(ptr,"stoploop")==0)
{ loopflag=0;
}
else if(strcmp(ptr,"capture")==0)
{ ptr=getwordbyspace(msgbuf);
capturefile(ptr);
removeoldfile(ptr);
}
else if(strcmp(ptr,"print")==0)
{ ptr=getwordbyspace(msgbuf);
printfile(ptr);
}
else if(strcmp(ptr,"setdate")==0)
{ ptr=getwordbyspace(msgbuf);
setdate(ptr);
}
else if(strcmp(ptr,"reboot")==0)
{ executefile("reboot");
};
};
};
void executefile(char *fname)
{
int ret;
pid_t pid;
int status;
char buf[200];
strcpy(buf,"./");
strcat(buf,fname);
pid=fork();
if(pid==0)
{
ret=execl(buf,fname,null);
if(ret!=0)
{ perror("execute");
exit(1);
};
exit(0);
};
setalarm(pid);
while((pid=wait(&status))>0)
printf("child %d died,exit code %d\",pid,status);
qpid=0;
printf("execute file %s\",fname);
};


意见与建议
沪ICP证:沪B2-20070217 版权所有:东方财富网



