Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <time.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <signal.h>
- #include <wait.h>
- #define PCHILD 10
- int fd[2];
- pid_t pid;
- void WaitId();
- int con=0;
- void SignalHandler(int sig,siginfo_t* info,void* text)
- {
- srand(255);
- char c=90;
- write(fd[1],&c,1);
- ++con;
- if(con==3)
- close(fd[1]);
- }
- int main(int argc,char** argv)
- {
- pipe(fd);
- int i=0;
- for(i=0;i<PCHILD;++i)
- {
- pid=fork();
- if(!pid)
- {
- char read[4];
- char write[4];
- sprintf(read,"%d",fd[0]);
- sprintf(write,"%d",fd[1]);
- execlp("./child","child",read,write,(char*)NULL);
- perror("Execlp failed\n");
- exit(-1);
- }
- else if(pid==-1)
- {
- perror("Fork failed\n");
- exit(-1);
- }
- }
- close(fd[0]);
- struct sigaction act;
- sigemptyset(&act.sa_mask);
- act.sa_sigaction=&SignalHandler;
- act.sa_flags=SA_SIGINFO;
- if(sigaction(SIGRTMIN+4,&act,NULL)==-1)
- {
- perror("Sigaction failed\n");
- killpg(getpgrp(),SIGTERM);
- }
- timer_t timerid;
- struct sigevent sevp;
- sevp.sigev_notify=SIGEV_SIGNAL;
- sevp.sigev_signo=SIGRTMIN+4;
- if(timer_create(CLOCK_REALTIME,&sevp,&timerid)==-1)
- {
- perror("timer create failed\n");
- exit(-1);
- }
- struct itimerspec it;
- struct itimerspec it_old;
- it.it_value.tv_sec=0;
- it.it_value.tv_nsec=500000000;
- it.it_interval.tv_sec=0;
- it.it_interval.tv_nsec=500000000;
- if(timer_settime(timerid,0,&it,&it_old)==-1)
- {
- printf("timer_settime failed\n");
- errno;
- killpg(getpgrp(),SIGTERM);
- }
- int ret;
- siginfo_t info;
- while(1)
- {
- ret=waitid(P_ALL,0,&info,WEXITED|WSTOPPED|WCONTINUED|WNOHANG);
- if(ret==-1)
- break;
- if(!ret && info.si_pid)
- printf("PID:%d Status:%d\n",info.si_pid,info.si_status);
- }
- close(fd[1]);
- return 0;
- }
- #define _GNU_SOURCE
- #include <stdio.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <time.h>
- #include <wait.h>
- #include <poll.h>
- int main(int argc,char** argv)
- {
- char* end1=NULL;
- char* end2=NULL;
- int rd=strtol(argv[1],&end1,10);
- int wr=strtol(argv[2],&end2,10);
- if(end1==argv[1] || end2==argv[2])
- exit(-1);
- if(fcntl(rd,F_GETFD)==-1 || fcntl(wr,F_GETFD)==-1 || errno==EBADF)
- {
- perror("File descriptor read or write is invalid\n");
- exit(-1);
- }
- time_t start,end;
- struct pollfd fds;
- fds.fd=rd;
- fds.events=POLLIN;
- struct timespec tm;
- tm.tv_sec=0;
- tm.tv_nsec=500000000;
- while(1)
- {
- char c;
- if(ppoll(&fds,1,&tm,NULL)>0)
- {
- read(rd,&c,1);
- time(&start);
- struct timespec req;
- if(c>48)
- {
- write(1,&c,1);
- (int)c--;
- write(wr,&c,1);
- time(&end);
- }
- req.tv_sec=0;
- req.tv_nsec=1000000;
- nanosleep(&req,NULL);
- }
- else
- {
- close(wr);
- close(rd);
- exit(0);
- }
- }
- return 1 ;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement