Значение ожидания((int *)0)

Одна из таких программ, которая использует функцию ожидания, подобную этой:

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
    int pid,fd[2]; int n; char line[20];        
    if(pipe(fd)<0) { 
        printf("Error creating pipe"); 
    } else { 
        pid=fork(); 
        if(pid<0) { 
            printf("Error while forking"); 
        } else { 
            if(pid>0) { 
                close(fd[0]); 
                write(fd[1],"Hello\n",6); 
                while(wait((int *)0)!=pid);
            } else { 
                close(fd[1]); 
                n=read(fd[0],line,20); 
                if(n<0) 
                printf("Error reading a file"); 
                write(1,line,n); 
            } 
        } 
    } 
    return 0; 
}   

person skinderneath    schedule 27.03.2009    source источник
comment
Если бы только пример кода имел какое-либо отношение к потокам.   -  person Sean Bright    schedule 27.03.2009
comment
@Sean - ты пропустил вызов fork()?   -  person tvanfosson    schedule 27.03.2009
comment
Неа. Вижу. По-прежнему не имеет ничего общего с потоками.   -  person Sean Bright    schedule 27.03.2009
comment
@ Шон -- понятно. Редактирование вопроса удалило ссылки на темы в тексте. Я думал, ты намекаешь, что ждать нечего. Конечно, это процесс, а не ожидаемый поток.   -  person tvanfosson    schedule 27.03.2009
comment
@tvanfosson: да, я изначально прокомментировал, когда тема еще была в заголовке/теле.   -  person Sean Bright    schedule 27.03.2009


Ответы (2)


Ответ Стажера правильный. Хотя следует отметить, что приведение совершенно необязательно, поскольку согласно стандарту 0, используемый в контексте указателя, является указателем NULL.

person user83255    schedule 27.03.2009

См. man wait(2).

wait((int *)0) звонит waitpid(-1, (int *)0, 0). На странице руководства указано:

Если статус не равен NULL, функции wait() и waitpid() сохраняют информацию о статусе в int, на который он указывает.

Здесь status равно NULL (0). Таким образом, ваш вызов wait ожидает изменения состояния в любом дочернем процессе и не возвращает состояние. Вызов просто проверяет, произошло ли изменение состояния для определенного дочернего процесса (pid в вашем случае).

person strager    schedule 27.03.2009