Advertisement
Guest User

Untitled

a guest
Mar 29th, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.29 KB | None | 0 0
  1.  
  2.  
  3. #include<signal.h>
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<unistd.h>
  7. #include<sys/wait.h>
  8. #include<string.h>
  9.  
  10. void Propagowac();
  11. void Child(int,siginfo_t *,void *);
  12. pid_t pid1,pid2;
  13.  
  14.  
  15. int main(int argc,char *argv[]){
  16.  
  17. printf("Proces pid = %d\n",getpid());
  18. pid_t pid;
  19. char *temp1,*temp2;
  20. char *child1[argc+1];
  21. char *child2[argc+1];
  22. int temp,status,options,tab[100];
  23. sigset_t childs,kills;
  24. int size =strlen(argv[argc-1]);
  25. struct sigaction tempsignal,child;
  26.  
  27. sigemptyset(&kills);
  28. sigaddset(&kills,SIGINT);
  29. tempsignal.sa_handler = &Propagowac;
  30. tempsignal.sa_mask=kills;
  31. tempsignal.sa_flags = SA_NODEFER;
  32.  
  33. sigaction(SIGINT,&tempsignal,NULL);
  34.  
  35.  
  36. sigemptyset(&childs);
  37. child.sa_sigaction = &Child;
  38. child.sa_flags = SA_SIGINFO;
  39.  
  40. sigaction(SIGCHLD,&child,NULL);
  41.  
  42.  
  43.  
  44.  
  45.  
  46. temp = size;
  47. int i=0;
  48.  
  49. while(temp)
  50. {
  51. tab[i]=temp%2;
  52. temp/=2;
  53. i++;
  54. }
  55.  
  56. temp=0;
  57. for(i-=1;i>=0;i--){
  58. if(tab[i])
  59. temp++;
  60. }
  61.  
  62. if(temp>1){
  63. fprintf(stderr,"Podanego lancucha znakow dlugosc nie jest potega dwojki\n");
  64. exit(EXIT_FAILURE);
  65. }
  66.  
  67. temp1 = (char*)malloc(sizeof(char));
  68. temp2 = (char*)malloc(sizeof(char));
  69.  
  70. if(size>1){
  71. for(int i=0;i<size/2;i++){
  72.  
  73. temp1[i] += argv[argc-1][i];
  74. temp2[i] += argv[argc-1][(size/2)+i];
  75.  
  76. }
  77.  
  78. for(int i=0;i<argc;i++){
  79. child1[i]=argv[i];
  80. child2[i]=argv[i];
  81. }
  82.  
  83. child1[argc]=temp1;
  84. child2[argc]=temp2;
  85. child1[argc+1]=NULL;
  86. child2[argc+1]=NULL;
  87.  
  88.  
  89. pid1=fork();
  90. if(pid1){
  91. pid2 = fork();
  92. if(!pid2)
  93. {
  94. setpgid(pid2,0);
  95. // printf("Pid lidera i Identyfikator grupy biezacego procesu %d\n",getpgid(0));
  96. execve(child2[0],child2,NULL);
  97. }
  98. else
  99. {
  100. while(1){
  101. }
  102. if((waitpid(pid2,&status,options)==-1))
  103. printf("Blad 2\n");
  104. /*Wartosc zwracana w poprawnym wykonaniu funkcji zwraca indentyfikator pid procesu potomnego
  105. ktory sie zakonczyl zakonczenie bledem zwraca -1*/
  106. //printf("pid %d status %d \n",pid,status);
  107. }
  108. while(1){
  109. }
  110. if((waitpid(pid1,&status,options)==-1))
  111. printf("Blad 1 \n");
  112. //printf("pid %d status %d \n",pid,status);
  113. }
  114. else
  115. {
  116. setpgid(0,0);
  117. // printf("Pid lidera i grupy procesu podanego pid %d\n",getpgid(pid1));
  118. execve(child1[0],child1,NULL);
  119. }
  120.  
  121. }
  122.  
  123. // printf("cos %d \n",sigismember(&set,SIGTSTP));
  124. printf("%d ",getpid());
  125. for(int i=1;i<argc;i++){
  126. printf("%s ",argv[i]);
  127. }
  128. printf("\n");
  129.  
  130.  
  131. return 0;
  132. }
  133.  
  134.  
  135.  
  136. void Propagowac(){
  137.  
  138. printf("Propagowanie: pid1=%d,pid2=%d\n",pid1,pid2);
  139. kill(pid1,SIGINT);
  140. kill(pid2,SIGINT);
  141.  
  142. }
  143. void Child(int N,siginfo_t *wsk,void *wsk1){
  144.  
  145. printf("Proces zakonczyl prace Pid = %d\n",wsk->si_pid);
  146.  
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement