Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<signal.h>
- #include<stdio.h>
- #include<stdlib.h>
- #include<unistd.h>
- #include<sys/wait.h>
- #include<string.h>
- void Propagowac();
- void Child(int,siginfo_t *,void *);
- pid_t pid1,pid2;
- int main(int argc,char *argv[]){
- printf("Proces pid = %d\n",getpid());
- pid_t pid;
- char *temp1,*temp2;
- char *child1[argc+1];
- char *child2[argc+1];
- int temp,status,options,tab[100];
- sigset_t childs,kills;
- int size =strlen(argv[argc-1]);
- struct sigaction tempsignal,child;
- sigemptyset(&kills);
- sigaddset(&kills,SIGINT);
- tempsignal.sa_handler = &Propagowac;
- tempsignal.sa_mask=kills;
- tempsignal.sa_flags = SA_NODEFER;
- sigaction(SIGINT,&tempsignal,NULL);
- sigemptyset(&childs);
- child.sa_sigaction = &Child;
- child.sa_flags = SA_SIGINFO;
- sigaction(SIGCHLD,&child,NULL);
- temp = size;
- int i=0;
- while(temp)
- {
- tab[i]=temp%2;
- temp/=2;
- i++;
- }
- temp=0;
- for(i-=1;i>=0;i--){
- if(tab[i])
- temp++;
- }
- if(temp>1){
- fprintf(stderr,"Podanego lancucha znakow dlugosc nie jest potega dwojki\n");
- exit(EXIT_FAILURE);
- }
- temp1 = (char*)malloc(sizeof(char));
- temp2 = (char*)malloc(sizeof(char));
- if(size>1){
- for(int i=0;i<size/2;i++){
- temp1[i] += argv[argc-1][i];
- temp2[i] += argv[argc-1][(size/2)+i];
- }
- for(int i=0;i<argc;i++){
- child1[i]=argv[i];
- child2[i]=argv[i];
- }
- child1[argc]=temp1;
- child2[argc]=temp2;
- child1[argc+1]=NULL;
- child2[argc+1]=NULL;
- pid1=fork();
- if(pid1){
- pid2 = fork();
- if(!pid2)
- {
- setpgid(pid2,0);
- // printf("Pid lidera i Identyfikator grupy biezacego procesu %d\n",getpgid(0));
- execve(child2[0],child2,NULL);
- }
- else
- {
- while(1){
- }
- if((waitpid(pid2,&status,options)==-1))
- printf("Blad 2\n");
- /*Wartosc zwracana w poprawnym wykonaniu funkcji zwraca indentyfikator pid procesu potomnego
- ktory sie zakonczyl zakonczenie bledem zwraca -1*/
- //printf("pid %d status %d \n",pid,status);
- }
- while(1){
- }
- if((waitpid(pid1,&status,options)==-1))
- printf("Blad 1 \n");
- //printf("pid %d status %d \n",pid,status);
- }
- else
- {
- setpgid(0,0);
- // printf("Pid lidera i grupy procesu podanego pid %d\n",getpgid(pid1));
- execve(child1[0],child1,NULL);
- }
- }
- // printf("cos %d \n",sigismember(&set,SIGTSTP));
- printf("%d ",getpid());
- for(int i=1;i<argc;i++){
- printf("%s ",argv[i]);
- }
- printf("\n");
- return 0;
- }
- void Propagowac(){
- printf("Propagowanie: pid1=%d,pid2=%d\n",pid1,pid2);
- kill(pid1,SIGINT);
- kill(pid2,SIGINT);
- }
- void Child(int N,siginfo_t *wsk,void *wsk1){
- printf("Proces zakonczyl prace Pid = %d\n",wsk->si_pid);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement