2013-04-09 3 views
1
#include<stdio.h> 
#include<stdlib.h> 
#include<unistd.h> 
#include<sys/sem.h> 
#include<sys/ipc.h> 
int sem_id; 
void update_file(int number) 
{ 
    struct sembuf sem_op; 
    FILE* file; 
    printf("Inside Update Process\n"); 
    /* wait on the semaphore, unless it's value is non-negative. */ 
    sem_op.sem_num = 0; 
    sem_op.sem_op = -1; /* <-- Amount by which the value of the semaphore is to be decreased */ 
    sem_op.sem_flg = 0; 
    semop(sem_id, &sem_op, 1); 

    /* we "locked" the semaphore, and are assured exclusive access to file. */ 
    /* manipulate the file in some way. for example, write a number into it. */ 
    file = fopen("file.txt", "a+"); 
    if (file) { 
     fprintf(file, " \n%d\n", number); 
     fclose(file); 
    } 

    /* finally, signal the semaphore - increase its value by one. */ 
    sem_op.sem_num = 0; 
    sem_op.sem_op = 1; 
    sem_op.sem_flg = 0; 
    semop(sem_id, &sem_op, 1); 
} 
void write_file(char* contents) 
{ 
    printf("Inside Write Process\n"); 
    struct sembuf sem_op; 
    sem_op.sem_num = 0; 
    sem_op.sem_op = -1; 
    sem_op.sem_flg = 0; 
    semop(sem_id, &sem_op, 1); 

    FILE *file = fopen("file.txt","w"); 
    if(file) 
    { 
     fprintf(file,contents); 
     fclose(file); 
    } 

    sem_op.sem_num = 0; 
    sem_op.sem_op = 1; 
    sem_op.sem_flg = 0; 
    semop(sem_id, &sem_op, 1); 
} 
int main() 
{ 
    //key_t key = ftok("file.txt",'E'); 
    sem_id = semget(IPC_PRIVATE, 1, 0600 | IPC_CREAT); 
    /*here 100 is any arbit number to be assigned as the key of the 
    semaphore,1 is the number of semaphores in the semaphore set, */ 
    if(sem_id == -1) 
    { 
     perror("main : semget"); 
     exit(1); 
    } 
    int rc = semctl(sem_id, 0, SETVAL, 1); 
    pid_t u = fork(); 
    if(u == 0) 
    { 
     update_file(100); 
     exit(0); 
    } 
    else 
    { 
     wait(); 
    } 
    pid_t w = fork(); 
    if(w == 0) 
    { 
     write_file("Hello!!"); 
     exit(0); 
    } 
    else 
    { 
     wait(); 
    } 
} 

Если я запускаю приведенный выше код в качестве переменного кода, функция write_file() вызывается после того, как функции update_file() Принимая во внимание, если я запускаю тот же код, как с ++ код, порядок исполнения обратного ... почему это так ??порядок исполнения раздвоенными процессов

+0

Случается это ВСЕГДА ??? –

+0

@ bash d: да .. это происходит для всех программ, которые я написал до сих пор ... –

ответ

1

Просто некоторые предложения, но он смотрит на меня, как это может быть вызвано сочетанием вещей:

  1. Ожидание() вызов должен принять аргумент указателя (который может быть NULL) , Компилятор должен был поймать это, но вы должны выбрать еще одно определение где-нибудь, что позволяет ваш синтаксис. Вы - , также отсутствует идентификатор для sys/wait.h. Возможно, поэтому компилятор не жалуется, как я ожидал.

  2. В зависимости от конфигурации вашего компьютера/ОС процесс fork'd может не запускаться до тех пор, пока родительский доход не выйдет. Предполагая, что «wait()» вы звоните, не работает так, как мы ожидали бы, это возможно для родителя, чтобы выполнить полностью до того, как дети приступить к работе.

К сожалению, я не смог дублировать то же временное поведение. Однако, когда я сгенерировал файлы сборки для каждого из двух случаев (C & C++), я заметил, что на версии C++ отсутствует системный вызов «wait», но версия C такая, как я ожидал. Для меня это говорит о том, что где-то в заголовках C++ эта специальная версия без аргумента #defined из кода. Это различие может быть причиной поведения, которое вы видите.

В двух словах ... добавить #include, и изменить ваше ожидание вызовов «ждать (0)»

Смежные вопросы