Напишите, откомпилируйте и запустите программу, которая бы запускала процесс с помощью fork() так, чтобы процесс-родитель и процесс-ребенок совершали разные действия (какие – не важно).
Code
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[], char *envp[])
{
int a = 0;
pid_t pid, ppid;
(void)fork();
a = a+1;
pid = getpid();
ppid = getppid();
pid = fork();
if(pid == -1)
{
printf("Oshibka");
}
else if (pid == 0)
{
printf("Process-rebenok:");
(void) execl("/bin/ls", "/bin/ls", "-r", "-t", "-l", (char *) 0);
}
else
{
printf("Process-roditel:");
}
printf("Error on program start\n");
return 0;
}
Написать программу, которая иллюстрирует использование системных вызовов open(), write(), read() и close() для записи информации в файл.
Code
/*Программа Task1.с, иллюстрирующая использование системных вызовов
open(), write() и close() для записи информации в файл */
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
int FileDescriptorWrite;
int FileDescriptorRead;
int SizeFile;
char* MyString = "Read and Write in File";
char* MyStringRead[23];
(void)umask(0);
if((FileDescriptorWrite = open("MyFile1.txt", O_WRONLY | O_CREAT, 0666)) < 0)
{
printf("Can\'t open file\n");
return -1;
}
SizeFile = write(FileDescriptorWrite, MyString, 23);
if (SizeFile != 23)
{
printf("Can\'t write all string\n");
return -1;
}
if(close(FileDescriptorWrite) < 0)
{
printf("Can\'t close file\n");
}
if((FileDescriptorRead = open("MyFile1.txt", O_RDONLY | O_CREAT, 0666)) < 0)
{
printf("Can\'t open file\n");
return -1;
}
SizeFile = read(FileDescriptorRead, MyStringRead, 23);
if (SizeFile < 0)
{
printf("Can\'t read string\n");
return -1;
}
printf("%s\n", MyStringRead);
if(close(FileDescriptorRead) < 0)
{
printf("Can\'t close file\n");
}
return 0;
}
Написать программу, которая иллюстрирует работу с pipe в рамках одного процесса.
Code
/* Программа Task2.с, иллюстрирующая работу с pip'ом в рамках одного процесса */
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
int FileDescriptor[2];
int SizeString;
char StringBefore[] = "Read and Write in PIPE";
char StringAfter[23];
if (pipe(FileDescriptor) < 0)
{
printf("can\'t create pipe\n");
return -1;
}
SizeString = write(FileDescriptor[1], StringBefore, 23);
if (SizeString != 23)
{
printf("Can\'t write all string\n");
return -1;
}
SizeString = read(FileDescriptor[0], StringAfter, 23);
if (SizeString < 0)
{
printf("can\'t read string\n");
return -1;
}
printf("%s\n", StringAfter);
if (close(FileDescriptor[0]) < 0)
{
printf("Can\'t close input stream\n");
}
if (close(FileDescriptor[1]) < 0)
{
printf("Can\'t close output stream\n");
}
return 0;
}
Написать программу, которая иллюстрирует однонаправленную связь через pipe между процессом-родителем и процессом-ребенком.
Code
/* Программа Task3.с, осуществляющая однонаправленную связь через pipe
между процессом-родителем и процессом-ребенком */
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
int FileDescriptor[2];
int Result;
int SizeString;
char StringWrite[] = "Read and write in PIPE";
char StringRead[23];
if(pipe(FileDescriptor) < 0)
{
printf("Can\'t create pipe\n");
return -1;
}
Result = fork();
if ((Result == 1) || (Result < 0))
{
printf("Can\'t fork child\n");
return -1;
}else
{
if (Result > 0)
{
close(FileDescriptor[0]);
SizeString = write(FileDescriptor[1], StringWrite, 23);
if(SizeString != 23)
{
printf("Can\'t write all string\n");
return -1;
}
close(FileDescriptor[1]);
printf("Parent exit\n");
}else
{
close(FileDescriptor[1]);
SizeString = read(FileDescriptor[0], StringRead, 23);
if(SizeString < 0)
{
printf("Can\'t read string\n");
return -1;
}
printf("%s\n",StringRead);
close(FileDescriptor[0]);
printf("Child exit\n");
}
}
return 0;
}