Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
1)
#include <stdlib.h>
#include <stdio.h>
int main()
{
pid_t pid;
pid = fork();
if (pid == 0) {
printf ("i am the child\n");
printf ("my pid is %d\n" , getpid());
sleep(10);
exit(1);
}
else {
printf("i am the parent\n");
printf("my pid is %d\n", getpid());
printf("my child's pid is %d\n", pid);
}
}
2)
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
void sig_handl()
{
printf("fork you!\n");
exit (0);
}
int main()
{
pid_t pid;
pid = fork();
if (pid == 0) {
printf ("i am the child\n");
printf ("my pid is %d\n" , getpid());
signal(15,sig_handl);
sleep(10);
}
else {
printf("i am the parent\n");
printf("my pid is %d\n", getpid());
printf("my child's pid is %d\n", pid);
sleep(5);
kill(pid, 15);
}
}
Pipe1 pipe2
FIFO
Serv cl
MSG
Serv cl
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <strings.h>
#define KEY 1174 // "магическое" число
#define MAXLEN 512
struct msg_t {
long mtype;
int snd_pid;
char body[MAXLEN];
};
int main() {
struct msg_t message;
int msgid;
char * response = "Ok!";
msgid = msgget(KEY, 0777 | IPC_CREAT); // создаем очередь сообщений
msgrcv(msgid, &message, sizeof(message), 2, 0); // ждем сообщение
printf("Client (pid = %i) sent: %s", message.snd_pid, message.body);
message.mtype = 1;
message.snd_pid = getpid();
strcpy(message.body, response);
msgsnd(msgid, &message, sizeof(message), 0); // посылаем ответ
msgrcv(msgid, &message, sizeof(message), 2, 0); // ждем подтверждения
msgctl(msgid, IPC_RMID, 0); // удаляем очередь
return EXIT_SUCCESS;
}
Ниже приводится исходный текст программы-клиента
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <strings.h>
#define KEY 1174 // "магическое" число
#define MAXLEN 512
struct msg_t {
long mtype;
int snd_pid;
char body[MAXLEN];
};
int main() {
int msgid;
int i;
struct msg_t message;
char buf[MAXLEN];
msgid = msgget(KEY, 0777); // получаем идентификатор очереди
i = 0;
while ( (i < (MAXLEN - 1)) && ((message.body[i++] = getchar()) != '\n') );
message.body[i] = '\0';
message.mtype = 2;
message.snd_pid = getpid ();
msgsnd(msgid, &message, sizeof(message), 0); // посылаем сообщение
msgrcv(msgid, &message, sizeof(message), 1, 0); // ждем ответа
printf("Server (pid= %i) responded: %s\n", message.snd_pid, message.body);
message.mtype = 2;
msgsnd(msgid, &message, sizeof(message), 0); // посылаем подтверждение
return EXIT_SUCCESS;
}
Shm
shm_open.c
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#define SHARED_MEMORY_OBJECT_NAME "my_shared_memory"
#define SHARED_MEMORY_OBJECT_SIZE 50
#define SHM_CREATE 1
#define SHM_PRINT 3
#define SHM_CLOSE 4
void usage(const char * s) {
printf("Usage: %s <create|write|read|unlink> ['text']\n", s);
}
int main (int argc, char ** argv) {
int shm, len, cmd, mode = 0;
char *addr;
if ( argc < 2 ) {
usage(argv[0]);
return 1;
}
if ( (!strcmp(argv[1], "create") || !strcmp(argv[1], "write")) && (argc == 3) ) {
len = strlen(argv[2]);
len = (len<=SHARED_MEMORY_OBJECT_SIZE)?len:SHARED_MEMORY_OBJECT_SIZE;
mode = O_CREAT;
cmd = SHM_CREATE;
} else if ( ! strcmp(argv[1], "print" ) ) {
cmd = SHM_PRINT;
} else if ( ! strcmp(argv[1], "unlink" ) ) {
cmd = SHM_CLOSE;
} else {
usage(argv[0]);
return 1;
}
if ( (shm = shm_open(SHARED_MEMORY_OBJECT_NAME, mode|O_RDWR, 0777)) == -1 ) {
perror("shm_open");
return 1;
}
if ( cmd == SHM_CREATE ) {
if ( ftruncate(shm, SHARED_MEMORY_OBJECT_SIZE+1) == -1 ) {
perror("ftruncate");
return 1;
}
}
addr = mmap(0, SHARED_MEMORY_OBJECT_SIZE+1, PROT_WRITE|PROT_READ, MAP_SHARED, shm, 0);
if ( addr == (char*)-1 ) {
perror("mmap");
return 1;
}
switch ( cmd ) {
case SHM_CREATE:
memcpy(addr, argv[2], len);
addr[len] = '\0';
printf("Shared memory filled in. You may run '%s print' to see value.\n", argv[0]);
break;
case SHM_PRINT:
printf("Got from shared memory: %s\n", addr);
break;
}
munmap(addr, SHARED_MEMORY_OBJECT_SIZE);
close(shm);
if ( cmd == SHM_CLOSE ) {
shm_unlink(SHARED_MEMORY_OBJECT_NAME);
}
return 0;
}
После создания объекта памяти мы установили нужный нам размер shared memory вызовом ftruncate(). Затем мы получили доступ к разделяемой памяти при помощи mmap(). (Вообще говоря, даже с помощью самого вызова mmap() можно создать разделяемую память. Но отличие вызова shm_open() в том, что память будет оставаться выделенной до момента удаления или перезагрузки компьютера.)
Компилировать код на этот раз нужно с опцией -lrt:
$ gcc -o shm_open -lrt shm_open.c
Смотрим что получилось:
$ ./shm_open create 'Hello, my shared memory!'
Shared memory filled in. You may run './shm_open print' to see value.
$ ./shm_open print
Got from shared memory: Hello, my shared memory!
$ ./shm_open create 'Hello!'
Shared memory filled in. You may run './shm_open print' to see value.
$ ./shm_open print
Got from shared memory: Hello!
$ ./shm_open close
$ ./shm_open print
shm_open: No such file or directory