следующий предлагаемый код:
- чисто компилирует
- выполняет желаемую функциональность
- проверяет (и обрабатывает) ошибки
- документы, почему каждый заголовок включен
- демонстрирует один метод межпроцессного взаимодействия (IP C) (каналы)
- демонстрирует хорошее использование горизонтального и вертикального интервалов для удобства чтения и простоты понимания
- использует
int main( void )
, поэтому компилятор не предупреждает о неиспользуемых параметрах. - используются фигурные скобки '{' и '}' в теле кодовых блоков
case 0:
и default
, поэтому в этих кодовых блоках могут быть локальные переменные
и теперь предлагаемый код:
#include <stdio.h> // printf(), perror()
#include <sys/types.h>// pid_t
#include <unistd.h> // fork(), pipe(), read()
#include <sys/wait.h> // wait()
#include <stdlib.h> // exit(), EXIT_SUCCESS, EXIT_FAILURE
enum { READ_FROM, WRITE_TO };
int main( void )
{
int status;
int fd[2];
if( pipe( fd ) )
{
perror( "pipe failed" );
exit( EXIT_FAILURE );
}
pid_t pid = fork();
switch( pid )
{
case -1:
perror( "fork failed" );
exit( EXIT_FAILURE );
case 0: // child process
{
int var = 1;
ssize_t bytesWritten;
close( fd[ READ_FROM ] );
if( ( bytesWritten = write( fd[ WRITE_TO ], &var, sizeof( var ) ) ) != sizeof( int ) )
{
perror( "write failed" );
close( fd[ WRITE_TO ] );
exit( EXIT_FAILURE );
}
close( fd[ WRITE_TO ] );
exit( EXIT_SUCCESS );
}
default: // parent process
{
int buffer = 0;
ssize_t bytesRead;
close( fd[ WRITE_TO ] );
if( ( bytesRead = read( fd[ READ_FROM ], &buffer, sizeof( buffer ) ) ) != sizeof( int ) )
{
perror( "read failed" );
close( fd[ READ_FROM ] );
wait( &status ); // waits for child to exit
exit( EXIT_FAILURE );
}
printf( "%d\n", buffer );
close( fd[ READ_FROM ] );
wait( &status ); // waits for child to exit
break;
}
}
}
Типичный / успешный запуск программы приводит к
1