Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> процессы,разделяемая память,семафоры, не до конца выполняется дочерний процесс 
:(
    Опции темы
rrrFer
  Дата 6.12.2009, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: нет
Всего: 1



Дочерний процесс не выполняется до конца,ародительский - не ожидает его завершения. Подскажите как исправить?
В конце приведен весь код,но вот кусочками:
тут создаю 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;
}

PM MAIL WWW ICQ   Вверх
rrrFer
Дата 7.12.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: нет
Всего: 1



решил проблему
Код

//#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;

sembuf    pb2={2,1,0},
        mb2={2,-1,0};
        
int f(int p){
    printf("in fork1\n");
    int i,n,j;
    char t[255];
    printf("in fork2\n");
    printf("p: %d\n",p);
    n=0,i=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,&mb2,1);
                mem->RES++;
                semop(sem,&pb2,1);
                printf("child RES = %d\n",mem->RES);
                break;
            }
            if(s[i]=='.') break;
            n=0; i++;
            continue;
        }
        printf("test2");
        t[n++]=s[i];
        i++;
    }
    printf("in fork :close\n");
    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,&pb2,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(NULL);
            
            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;
}



PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0797 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.