Дочерний процесс не выполняется до конца,ародительский - не ожидает его завершения. Подскажите как исправить? В конце приведен весь код,но вот кусочками: тут создаю np процессов,и жду покаони заверашатся, на самом деле, родитель не ждет завершения, непонимаю почему:
| Код | for(j=0;j<np;j++) if(!fork()){ printf("fork good\n"); f(param[j]); printf("return fork"); return 0; } for(j=0;j<np;j++) wait(0); //semop(sem,(sembuf*)(1,-1,0),1); printf("continue:\n");
|
фраза ретурн форк не выводится, также как и часть тех сообщений что должны быть выведены при работе функции f(), однако континьювыводится. В функции f() выводится только часть сообщений на экран:
| Код | printf("in fork1\n"); int i,n,j; char t[255]; printf("in fork2\n"); printf("p: %d\n",p);
for(;;){ printf("test1");
|
тут "test1" на экран уже не выводится, тоже непонимаю как так. Полагаю что дочерний процесс по каким то причинамзавершается раньше чем надо,но почему и как исправить незнаю,ниже привел полностью код.Программа считает точки в строке пользователя,заносит их позиции в массив и затем должна найти самое длинное слово,имебщееся во всех предложениях.
| Код | //#include <sched.h> #include <stdio.h> #include <unistd.h> //#include <sys/ipc.h> #include <sys/sem.h> #include <sys/shm.h> #include <sys/wait.h> char *s; struct mymem{ int RES; char cw[10]; } *mem;
int shmid; int sem;
int f(int p){ printf("in fork1\n"); int i,n,j; char t[255]; printf("in fork2\n"); printf("p: %d\n",p);
for(;;){ printf("test1"); if(s[i]==' '||!s[i]||s[i]=='.'){ t[n]=0; printf("child word: %s\n",t); for(j=0;j<n+1;j++){ printf("t[%d] = %c , cw[%d] = %c \n",j,t[j],j,mem->cw[j]); if(t[j]!=mem->cw[j]) break; } if((j==n+1)&&n!=0){ //semop(sem,(sembuf*)(2,-1,0),1); mem->RES++; //semop(sem,(sembuf*)(2,1,0),1); printf("child RES = %d\n",mem->RES); break; } if(s[i]=='.') break; n=0; i++; continue; } printf("test2"); t[n++]=s[i]; printf("t[n++]=s[i]\n"); i++; } printf("in fork :close\n"); semop(sem,(sembuf*)(1,1,0),1); return 0; }
int main(){ int i,np,j,*param,n,max; char sm[255]; s=new char[255];
if((shmid=shmget(IPC_PRIVATE,sizeof(mymem),IPC_CREAT|0666))<0){ printf("error <SHMGET>"); return 1; } mem=(mymem*)shmat(shmid,NULL,0); //sem=semget(IPC_PRIVATE,5,IPC_CREAT|0666); //semop(sem,(sembuf*)(2,1,0),1); printf("S: "); gets(s); printf("number of sentens: "); for(i=0,np=0;s[i];i++) np+=s[i]=='.'; printf("%d\n",np--); printf("param: \n"); param=new int[np]; for(j=i=0;i<np;i++){ for(;s[j]!='.';j++); param[i]=++j; printf("\tparam[%d] = %d \n",i,param[i]); } for(i=n=max=0;;i++){ if(s[i]==' '||!s[i]||s[i]=='.'){ mem->cw[++n]=0; printf("main word: %s\n",mem->cw); for(j=0;j<np;j++) if(!fork()){ printf("fork good\n"); f(param[j]); printf("return fork"); return 0; } for(j=0;j<np;j++) wait(0); //semop(sem,(sembuf*)(1,-1,0),1); printf("continue:\n"); if(mem->RES==np&&n>max){ max=n; for(j=0;j<n;j++) sm[j]=mem->cw[j]; sm[j]=0; } mem->RES=0; n=0; if(s[i]=='.') break; continue; } mem->cw[n++]=s[i]; } if(!max) printf("not sentens\n"); else printf("%s\n",sm); return 0; }
|
|