The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"проблема с execl"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"проблема с execl"  +/
Сообщение от bymer email on 05-Окт-09, 17:30 
Здравствуйте! У меня такая проблема: Из одной программы я вызываю другую. Вот из которой вызываю:


#include <curses.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <signal.h>
#include <sys/time.h>
#include <time.h>
#include <termios.h>
#include <sys/ioctl.h>

#define MAXFORK 30

int next_y;
int koord_y;

struct result
{
    int caseNumber;
    int argument;
};

struct process
{
    int  pid;
    char name[20];
    bool isPaused;
};
process *procs;

int mygetch()
{
    struct termios oldt, newt;
    int ch;
    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    ch=getchar();
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return ch;
}
void drawLines()
{
    clear();
    refresh();
    int i;
    int x,y;
    
    y = 1;
    x = COLS;
    move(1,0);
    for(i = 0; i < LINES-1; i++)
    {
        move(y,0);
        wprintw(stdscr,"|");
        move(y,x-1);
        wprintw(stdscr,"|");
        move(y,x-20);
        if(i+5<LINES)
            wprintw(stdscr,"|");
        y++;
    }
    move(0,0);
    for(i = 0; i < COLS; i++)
        wprintw(stdscr,"-");
    move(2,1);
    for(i = 0; i < COLS-21; i++)
        wprintw(stdscr,"-");
    move(LINES-5,0);
    for(i = 0; i < COLS; i++)
        wprintw(stdscr,"-");
    move(LINES-1,0);
    for(i = 0; i < COLS; i++)
        wprintw(stdscr,"-");
    
    move(LINES-3,2);
    wprintw(stdscr,"cmd:");
    refresh();
}

void drawProcs(process *names)
{
    int y = 1;
    int x = COLS-19;
    int i=0;
    char *s;
    time_t tp;
    for(;i<MAXFORK;i++)
    {
        if(names[i].pid)
        {
            move(y,x);
            wprintw(stdscr,"%s",names[i].name);            
            y++;
        }    
    }
}


void signal_handler(int signum)
{
refresh();
  move(1,1);
  wprintw(stdscr,"process %d",next_y+1);
  refresh();
  usleep(200000);
  move(1,1);
  wprintw(stdscr,"          ");
  refresh();

}

int addProcess()
{
        int w;
    int pid = fork();
    if(pid == -1)
        exit(1);
    if(pid == 0)
    {
        w=execl("/home/pasha/Документы/1", "1",(char*)0);
        sigset_t sig_mask;
        struct sigaction act;
        sigemptyset(&sig_mask);
        act.sa_mask = sig_mask;
        act.sa_flags = 0;
        act.sa_handler = &signal_handler;
        sigaction(SIGUSR1,&act,NULL);
        while(1)
        {

            pause();
            kill(getppid(),SIGUSR1);
        }
                
    }
    else
        return pid;
    koord_y++;
    return 0;
}

void init_screen()
{
    initscr();
    echo();
    curs_set(1);
}

void clearCMD()
{
    move(LINES-3,6);
    clrtoeol();
    refresh();
    move(LINES-3,7);
}
void nothing(int sig)
{}

int main()
{
    int ret;
    procs = (process*)calloc(MAXFORK,sizeof(process));
    koord_y = 1;
    sigset_t sig_mask;  
    struct sigaction act;
    act.sa_handler = ¬hing;
    sigemptyset(&sig_mask);
    act.sa_mask = sig_mask;
    act.sa_flags = 0;
    sigaction(SIGUSR1,&act,NULL);

        init_screen();    
        
        
        int count = 0;
        int  i;
        char cmd[50],namebuf[20];
        
        int key;
        result res;
        
        drawLines();
        clearCMD();

        while(1)
        {  
        key = mygetch();
        switch(key)
    {
        case 'c': for(i=0;procs[i].pid !=0 ; i++);
                next_y = i;
                move(1,1);
                procs[i].pid = addProcess();
                procs[i].isPaused = false;
                sprintf(procs[i].name,"pid %d | active",procs[i].pid);
                count++;
             break;
        case '0': ;
        case '1': ;
        case '2': ;
        case '3': ;
        case '4': ;
        case '5': ;
        case '6': ;
        case '7': ;
        case '8': ;
        case '9':     int k = (int) key - 49;
                
                        if(procs[k].isPaused == false)
                        {
                            procs[k].isPaused = true;
                            sprintf(procs[k].name,"pid %d | paused",procs[k].pid);    
                        }
                        else
                        {
                            procs[k].isPaused = false;
                            sprintf(procs[k].name,"pid %d | active",procs[k].pid);    
                        }
                    
            
break;
    }
            move(1,1);
            refresh();          
            for(i = 0 ; i < MAXFORK ; i++)
            if(procs[i].pid)
            {
                if(procs[i].isPaused == false)
                {
                    kill(procs[i].pid,SIGUSR1);
                    pause();
                }
            }
            
            drawLines();
            drawProcs(procs);
            clearCMD();
            cmd[0] = '\0';                        
        }            
        endwin();
}

А вот которую вызываю:


#include <termios.h>
#include <sys/ioctl.h>
#include <signal.h>
#include <stdlib.h>
#include <curses.h>
#include <time.h>
#include <sys/time.h>
void alarm_handler()
{
int i;
time_t tp;
char *s;
tp = time(NULL);
s = ctime(&tp);
wprintw(stdscr,"%s",s);
refresh();
}

int main(int argc, char * argv[])
{
struct itimerval delay;
int ret;
int y;
if(argc>1)
y=(int)argv[1];
signal (SIGALRM, alarm_handler);
delay.it_value.tv_sec = 3;
delay.it_value.tv_usec = 0;
delay.it_interval.tv_sec = 1;
delay.it_interval.tv_usec = 0;
ret = setitimer (ITIMER_REAL, &delay, NULL);

initscr();
curs_set(TRUE);
while(1)
{
move(3,1);
pause();
}
endwin();
exit(EXIT_SUCCESS);
}
В этой выводится время. После выполнения и нажатия клавиши "c" курсор зависает на экране с надписью "|" и ничего больше нажать нельзя - помогает только CTRL-C. А нужно чтобы шло время. Подскажите пожалуйста в чем я не прав?

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "проблема с execl"  +/
Сообщение от ACCA (ok) on 07-Окт-09, 10:42 
Многа букав ниасилил.

Что бросилось в глаза - у родителя после execl идут попытки что-то делать. Если execl успешен, из него не возвращаются. Образ текущего процесс будет целиком заменён и никаких while {sleep ... kill } не произойдёт. Если вернулся - значит произошла ошибка и вызвать /home/pasha/Документы/1 не удалось.

Замечания по стилю - не балуйся calloc, сделай лучше переменную в стеке.
Не пользуйся глобальными переменными, передавай значения/указатели в явном виде.
Не пользуйся русскими именами файлов/каталогов, особенно в коде.

По большому счёту - брось эти сигналы и ncurses, займись чем-нибудь полезным. Например портани Openpref под qt4. Заодно посмотришь, как пишутся программы.  Потом подумаешь, как написать ему ИИ поумнее.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "такая тема"  +/
Сообщение от Вова on 07-Окт-09, 13:51 
>Из одной программы я вызываю другую

и убиваю в строчке:

kill(procs[i].pid,SIGUSR1);

через определяемый пользователем сигнал 1, который не обрабатывается в дочернем процессе.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру