1 / 1 / 0
Регистрация: 07.06.2011
Сообщений: 32
1

Порождение процесса - найти ошибку в коде

08.01.2012, 18:54. Показов 1524. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
такое задание:
Главный процесс создает дочерний процесс, записывает ему в канал текстовоое сообщение, дочерний процесс распечатывает это сообщение на экран. После этого главный процесс выводит на экран pid дочернего процесса и посылает сигнал SIGALRM дочернему процесссу. После прихода этого сигнала дочерний процесс прекращает свою работу.
Помогите найти ошибку, и по возможности как нибудь модифицировать в лучшую сторону
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdio.h>
int pid;
void hand(int s)
{
    printf("%d",pid);
    kill(pid,SIGALRM);
}
int main(int argc, char **argv)
{   
    char *str="abcdefg";
    int  fd[2];
    char buf[80];
    pipe(fd);
    if ((pid=fork())==-1) exit(1);
    if (pid)
    {
        //батя
        signal(SIGTRAP,hand);
        close(fd[0]);
        write(fd[1],str, strlen(str));
        close(fd[1]);
        while(1);
        
    }
    else
    {
        //сына
        
        close(fd[1]);
        read(fd[0], buf, strlen(str));
        write(1, buf, strlen(str));
        close(fd[0]);
        kill(getppid(),SIGTRAP);
        for (; ;) {}           
        
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2012, 18:54
Ответы с готовыми решениями:

Найти ошибку в коде
#include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;malloc.h&gt; typedef struct node { int num;...

Найти ошибку в коде
#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;conio.h&gt; unsigned char read_mat(const char...

Найти ошибку в коде
#include &lt;math.h&gt; #include &lt;stdio.h&gt; int main() { float Z,x; printf(&quot;\n input x&quot;); ...

Найти ошибку в коде
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; { const int size_a=5; int main() int a; int...

18
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
08.01.2012, 19:13 2
В задании родительский процесс шлёт SIGALRM, а у вас дочерний SIGTRAP...
Каким же образом должен завершаться дочерний процесс? Он так и останется висеть, поедая процессорное время пустым циклом. Слип туда воткни что ли.
0
1 / 1 / 0
Регистрация: 07.06.2011
Сообщений: 32
08.01.2012, 19:19  [ТС] 3
нужно чтобы отец напечатал пид сына по завершению вывода строки, поэтому у меня сын посылает сигнал отцу, а отец на него реагирует по функции hand() выпечатывая pid, и уже после этого посылает сигнал сыну SIGALRM чтобы он завершился
0
Gepar
08.01.2012, 19:19
  #4

Не по теме:

мало stdio.h и unistd.h подключили вот и не работает

0
1 / 1 / 0
Регистрация: 07.06.2011
Сообщений: 32
08.01.2012, 19:20  [ТС] 5
Цитата Сообщение от Gepar Посмотреть сообщение

Не по теме:

мало stdio.h и unistd.h подключили вот и не работает

извиняюсь за такой бардак в инклудах, просто в одном окошке в разное время выполнялись разные задания
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
08.01.2012, 19:21 6
Показалось, что в обработчике не подача сигнала, а выход. Но от этого не легче, в таком случае, как завершится родительский процесс?
0
49 / 49 / 8
Регистрация: 17.07.2011
Сообщений: 380
08.01.2012, 19:23 7
f1z1, я сейчас похожим занимаюсь.
а подскажите, пожалуйста, как у вас преподы объясняют что такое в программном коде процесс? где в программе ядро? или же что такое поток в программе(исходя их того, что процесс состоит из нескольких потоков) ?

просто у меня остался долг. а препод что ведет в отпуске(( а в интернете не могу найти конкретный ответ.
даже вот тему запостил на этом форуме:
Создание программы, которая работает по принципам операционной системы
0
1 / 1 / 0
Регистрация: 07.06.2011
Сообщений: 32
08.01.2012, 19:23  [ТС] 8
в задании о завершении ничего не говорится, в конце концов можно поставить wait
проблема в том что пид не печатается, хотя на мой взгляд все правильно
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
08.01.2012, 19:31 9
C
1
2
3
4
5
6
void hand(int s)
{
    printf("%d",pid);
    fflush(stdout);
    kill(pid,SIGALRM);
}
Добавлено через 51 секунду
Или можно перенос в конце формата добавить
0
1 / 1 / 0
Регистрация: 07.06.2011
Сообщений: 32
08.01.2012, 19:34  [ТС] 10
И каким образом это решает проблему? пид не выводится, сын не завершается
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
08.01.2012, 19:39 11
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdio.h>
int pid;
void hand(int s)
{
    printf("%d",pid);
    fflush(stdout);
    kill(pid,SIGALRM);
}
int main(int argc, char **argv)
{   
    char *str="abcdefg\n";
    int  fd[2];
    char buf[80];
    pipe(fd);
    if ((pid=fork())==-1) exit(1);
    if (pid)
    {
        //батя
        signal(SIGUSR1,hand);
        close(fd[0]);
        write(fd[1],str, strlen(str));
        close(fd[1]);
        while(1);
        
    }
    else
    {
        //сына
        
        close(fd[1]);
        read(fd[0], buf, strlen(str));
        write(1, buf, strlen(str));
        close(fd[0]);
        kill(getppid(),SIGUSR1);
        for (; ;) {}           
        
    }
}
УМВР
0
1 / 1 / 0
Регистрация: 07.06.2011
Сообщений: 32
08.01.2012, 19:44  [ТС] 12
скажите, у вас с такими исправлениям вывелся пид сына? у меня нет...
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
08.01.2012, 19:49 13
Вывелся.
0
1 / 1 / 0
Регистрация: 07.06.2011
Сообщений: 32
08.01.2012, 19:51  [ТС] 14
то есть проблема была в этом?
char *str="abcdefg\n";
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
08.01.2012, 19:54 15
Проблема была в том, что не сбрасывались буферы потоков вывода. С одинаковым успехом решается наличием переноса строки и ручным сбросом через fflush.
0
1 / 1 / 0
Регистрация: 07.06.2011
Сообщений: 32
08.01.2012, 20:08  [ТС] 16
То есть сын зацикливался на чтении так как не видел конца?

Добавлено через 3 минуты
C
1
2
3
4
5
6
            close(fd[1]);
                read(fd[0], buf, strlen(str));
                write(1, buf, strlen(str));
                close(fd[0]);
                kill(getppid(),SIGUSR1);
                for (; ;) {}
еще вопрос, обязательно ли закрывать дискрипторы?
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
08.01.2012, 20:16 17
Нет, просто операции вывода буферизированные, до тех пор пока эти буферы по тем или иным причинам не будут сброшены, на экране ничего не отобразится.
Дескрипторы лучше закрывать, их общее количество — величина конечная, так что держать неиспользуемые не стоит. С другой стороны при завершении работы система сама позаботиться обо их закрытии. Ситуация примерно такая же, как с освобождением динамической памяти.
0
1 / 1 / 0
Регистрация: 07.06.2011
Сообщений: 32
08.01.2012, 20:26  [ТС] 18
заметил что если ввести такую поправку то тоже все сработает
C
1
printf("%d\n",pid);
хотя тут буфер сбрасывается уже по заврешению вывода...
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
08.01.2012, 20:33 19
Как бы после завершения и надо, не? Ты записал в буфер нечто, а потом сбросил его.
0
08.01.2012, 20:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2012, 20:33
Помогаю со студенческими работами здесь

Найти ошибку в коде
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; //Çàïîëíåíèå ìàòðèöû void...

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

Найти ошибку в коде
почему не работает программа??: #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; int...

Найти ошибку в коде
Здравствуйте! Помогите, пожалуйста, найти ошибку в коде. В &quot;middle of array&quot; выдает ошибку #qnano,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru