дочерний процесс записи в файл - PullRequest
0 голосов
/ 06 декабря 2010

Я должен сделать программу, которая будет делать два дочерних процесса. Эти процессы будут записывать что-то (строка ...) в файл. Родительский процесс должен решить, какой процесс собирается записать в файл я создал дочерние процессы, но я застрял в этих сигналах, и у меня нет понятия, как это сделать

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#define READY_SIGNAL SIGUSR1
#define max 1000
int main(int argc, char *argv[]) {
        FILE *file;
        int o;
        char *name;
    opterr = 0;
        while ((o = getopt(argc, argv, "hp:")) != -1)
                switch (o) {
                        case 'h':
                        Help();
                        exit(1);

                        default:
                exit(1);
        }
    argc -= optind;
    argv += optind;
        if(argc==0){
        printf("file name\n");
        scanf("%s",&name);
        file=fopen(name,"a+");
        if( file != NULL)
        {
                printf("file created\n");
               // fclose(file);
         }

        else printf("the file does not exist\n");

        }
        else if(argc>1) {
                return(1);
        }
        else
                meno=argv[0];
        file=fopen(name,"a");
        if( file != NULL){
        printf("file created\n");
        }
        else printf("the file does not exist\n");

pid_t child_pid, child_pid2;

 printf ("the main program process ID is %d\n", (int) getpid());

 child_pid = fork () ;
 if (child_pid != 0) {
    printf ("this is the parent process, with id %d\n", (int) getpid ());
    printf ("the child's process ID is %d\n",(int) child_pid );
}
 else {
   printf ("this is the child process, with id %d\n", (int) getpid ());
exit(0);
}

 child_pid2 = fork () ;
 if (child_pid2 != 0) {
    printf ("this is the parent process, with id %d\n", (int) getpid ());
    printf ("the child's process ID is %d\n",(int) child_pid2 );
}
 else
{
   printf ("this is the child process, with id %d\n", (int) getpid ());
   exit(0);
}
 return 0;

}

спасибо

1 Ответ

1 голос
/ 06 декабря 2010

Для начала ваши дочерние процессы завершаются сразу после их создания.Если бы они этого не сделали, тогда первый ребенок создал бы своего собственного ребенка.Вы, вероятно, захотите создать дочерние элементы в цикле for и сделать что-то вроде:

if(child_pid[i] != 0)
{
    /* This is the parent. */
}
else
{
    /* This is the child. */
    do_child_stuff();
    exit(0);
}

Неправильно открывать файл перед выполнением fork ().В итоге вы получите три процесса, каждый из которых хранит дескриптор файла в одном и том же файле с одинаковыми правами доступа.Жизнь начинает усложняться, если вы делаете это!В общем случае открывайте файлы только тогда, когда вам это действительно нужно, и закрывайте их, как только вы закончите их использовать.


Я думаю, что ваш вопрос означает, что вы хотите, чтобы родительский процесс сказал ребенкунаписать, отправив сигнал от родителя ребенку.Есть более простые способы сделать это, но я думаю, ваш учитель хочет, чтобы вы продемонстрировали, как делать это с помощью сигналов.

Прежде всего, вам нужно написать обработчик сигнала.См. http://linux.die.net/man/2/signal для получения дополнительной информации о том, как это сделать.

Во-вторых, вам действительно нужно отправить сигнал.См. http://linux.die.net/man/2/kill для получения дополнительной информации.Обратите внимание, что название «убить» немного неправильное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...