实验八 进程间实验 |
您所在的位置:网站首页 › linux实验八进程管理 › 实验八 进程间实验 |
内容 项目 作业课程 Linux实验 作业要求 实验八 进程间实验 姓名-学号 17041412-陈志强 作业学习目标 1了解进程间通信的常用方式; 2掌握管道、消息队列、信号量、共享内存实现进程间通信的方法。 1举例说明使用匿名管道进行进程通信。 匿名管道: 当进程使用 pipe 函数,就可以打开位于内核中的这个特殊"文件"。同时 pipe 函数会返回两个描述符,一个用于读,一个用于写。如果你使用 fstat 函数来测试该描述符,可以发现此文件类型为 FIFO 。而无名管道的无名,指的就是这个虚幻的"文件",它没有名字。 man 2 pipe
它的参数是一个大小为 2 的数组。此数组的第 0 个元素用来接收以读的方式打开的描述符,而第 1 个元素用来接收以写的方式打开的描述符。也就是说, pipefd[0] 是用于读的,而 pipefd[1] 是用于写的。 打开了文件描述符后,就可以使用 read(pipefd[0]) 和 write(pipefd[1]) 来读写数据了。 例题: 父进程 fork 出一个子进程,通过无名管道向子进程发送字符,子进程收到数据后将字符串中的小写字符转换成大写并输出。 //hellopipe.c#include #include #include #include void child(int *fd) { close(fd[1]); // 子进程关闭写端 char buf[64]; int n = 0,i; while(1) { n = read(fd[0], buf, 64);//如果没有数据可读,read会阻塞;如果父进程退出,read返回0. for (i = 0; i cuid); printf("egid of creator = %d\n", perm->cgid); printf("mode = 0%o\n", perm->mode);}// 打印 ipc 内核对象信息void printShmid(struct shmid_ds *shmid) { printPerm(&shmid->shm_perm); printf("segment size = %ld\n", shmid->shm_segsz); printf("last attach time = %s", ctime(&shmid->shm_atime)); printf("last detach time = %s", ctime(&shmid->shm_dtime)); printf("last change time = %s", ctime(&shmid->shm_ctime)); printf("pid of creator = %d\n", shmid->shm_cpid); printf("pid of last shmat/shmdt = %d\n", shmid->shm_lpid); printf("No. of current attaches = %ld\n", shmid->shm_nattch);}// 创建 ipc 内核对象void create() { int id = shmget(0x8888, 123, IPC_CREAT | IPC_EXCL | 0664); printf("create %d\n", id); ASSERT(id);}// IPC_STAT 命令使用,用来获取 ipc 内核对象信息void show() { int id = shmget(0x8888, 0, 0); ASSERT(id); struct shmid_ds shmid; ASSERT(shmctl(id, IPC_STAT, &shmid)); printShmid(&shmid);}// IPC_SET 命令使用,用来设置 ipc 内核对象信息void set() { int id = shmget(0x8888, 123, IPC_CREAT | 0664); ASSERT(id); struct shmid_ds shmid; ASSERT(shmctl(id, IPC_STAT, &shmid)); shmid.shm_perm.mode = 0600; ASSERT(shmctl(id, IPC_SET, &shmid)); printf("set %d\n", id);}// IPC_RMID 命令使用,用来删除 ipc 内核对象void rm() { int id = shmget(0x8888, 123, IPC_CREAT | 0664); ASSERT(id); ASSERT(shmctl(id, IPC_RMID, NULL)); printf("remove %d\n", id);}// 挂接和卸载void at_dt() { int id = shmget(0x8888, 123, IPC_CREAT | 0664); ASSERT(id); char *buf = shmat(id, NULL, 0); if (buf == (char*)-1) ASSERT(-1); printf("shmat %p\n", buf); sleep(5); // 等待 5 秒后,执行 shmdt ASSERT(shmdt(buf)); printf("shmdt %p\n", buf);}int main(int argc, char *argv[]) { if (argc |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |