使用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);
};