请问这个怎么做?

2020-05-09 15:48发布

一、 利用fork() 、wait()、exit()函数编写一进程相关的程序。 
二、 利用semget() 、semctl()、semop()函数编写一信号量相关的程序。

一、 利用fork() 、wait()、exit()函数编写一进程相关的程序。 
二、 利用semget() 、semctl()、semop()函数编写一信号量相关的程序。

1条回答
爱小奇
2楼 · 2020-05-11 10:36

这些内容属于C语言开发相关内容(进程间通信,信号量操作等)可以参照如下代码尝试:

源文件为seml.c,代码如下:

#include

#include

#include

#include

#include

#include

#include

#include

 

//union semun

//{

//  int val;

//  struct semid_ds *buf;

//  unsigned short *arry;

//};

 

static int sem_id = 0;

static int set_semvalue();

static void del_semvalue();

static int semaphore_p();

static int semaphore_v();

 

int main(int argc, char *argv[])

{

    char message = 'X';

    int i = 0;

 

    // 创建信号量

    sem_id = semget((key_t) 1234, 1, 0666 | IPC_CREAT);

 

    if (argc > 1)

    {

        // 程序第一次被调用,初始化信号量

        if (!set_semvalue())

        {

            fprintf(stderr, "Failed to initialize semaphore\n");

            exit(EXIT_FAILURE);

        }

 

        // 设置要输出到屏幕中的信息,即其参数的第一个字符

        message = argv[1][0];

        sleep(2);

    }

 

    for (i = 0; i < 10>

    {

        // 进入临界区

        if (!semaphore_p())

        {

            exit(EXIT_FAILURE);

        }

 

        // 向屏幕中输出数据

        printf("%c", message);

 

        // 清理缓冲区,然后休眠随机时间

        fflush(stdout);

        sleep(rand() % 3);

 

        // 离开临界区前再一次向屏幕输出数据

        printf("%c", message);

        fflush(stdout);

 

        // 离开临界区,休眠随机时间后继续循环

        if (!semaphore_v())

        {

            exit(EXIT_FAILURE);

        }

        sleep(rand() % 2);

    }

 

    sleep(10);

    printf("\n%d - finished\n", getpid());

 

    if (argc > 1)

    {

        // 如果程序是第一次被调用,则在退出前删除信号量

        sleep(3);

        del_semvalue();

    }

    exit(EXIT_SUCCESS);

}

 

static int set_semvalue()

{

    // 用于初始化信号量,在使用信号量前必须这样做

    union semun sem_union;

 

    sem_union.val = 1;

    if (semctl(sem_id, 0, SETVAL, sem_union) == -1)

    {

        return 0;

    }

    return 1;

}

 

static void del_semvalue()

{

    // 删除信号量

    union semun sem_union;

 

    if (semctl(sem_id, 0, IPC_RMID, sem_union) == -1)

    {

        fprintf(stderr, "Failed to delete semaphore\n");

    }

}

 

static int semaphore_p()

{

    // 对信号量做减1操作,即等待P(sv)

    struct sembuf sem_b;

    sem_b.sem_num = 0;

    sem_b.sem_op = -1;//P()

    sem_b.sem_flg = SEM_UNDO;

    if (semop(sem_id, &sem_b, 1) == -1)

    {

        fprintf(stderr, "semaphore_p failed\n");

        return 0;

    }

 

    return 1;

}

 

static int semaphore_v()

{

    // 这是一个释放操作,它使信号量变为可用,即发送信号V(sv)

    struct sembuf sem_b;

    sem_b.sem_num = 0;

    sem_b.sem_op = 1; // V()

    sem_b.sem_flg = SEM_UNDO;

    if (semop(sem_id, &sem_b, 1) == -1)

    {

        fprintf(stderr, "semaphore_v failed\n");

        return 0;

    }

 

    return 1;

}


相关问题推荐

  • 回答 77

    云计算话题太大了,建议学具体点的可落地的,找个培训班摸两月项目比自学找各种杂资料性价比更高

  • 回答 4

    交换机不分进线和出线,找个接口插上即可。交换机每一端口都可视为独回立的物理网段(注:答非IP网段),连接在其上的网络设备独自享有全部的带宽,无须同其他设备竞争使用。当节点A向节点D发送数据时,节点B可同时向节点C发送数据,而且这两个传输都享有网络...

  • 回答 16

    查看topic分布情况kafka-list-topic.sh:bin/kafka-list-topic.sh-zookeeper 192.168.197.170:2181,192.168.197.171:2181 (列出所有topic的分区情况)bin/kafka-list-topic.sh-zookeeper 192.168.197.170:2181,192.168.197.171:2181-t...

  • 编码的特点是什么2021-02-04 10:06
    回答 6
    已采纳

    1.鉴别 编码是鉴别信息分类对象的唯一标识。2.分类 当分类对象按一定属性分类时,对每一类别设计一个编码,这时编码可以作为区分对象类别的标识。这种标识要求结构清晰,毫不含糊。3.排序 由于编码所有的符号都具有一定的顺序,因而可以方便地按此顺序进行排...

  • 回答 6
    已采纳

    静态资源和动态资源的概念:静态资源:我的理解是前端的固定页面,这里面包含HTML、CSS、JS、图片等等,不需要查数据库也不需要程序处理,直接就能够显示的页面。具体形式为:客户端发送请求到web服务器,web服务器拿到对应的文件,返回给客户端,客户端解析...

  • 回答 39

    编程和UI,一个程序向,每天更多的面对满屏幕的代码,对逻辑思维和数学有基本要求。UI设计则是美术向,网站UI、app应用UI和游戏UI要求又不一样(游戏要求更高)。一个好的UI设计师需要具备平面设计,交互设计,手绘等等。...

  • 回答 4
    已采纳

    查看进程--方法:ps -aux | grep &#39;zookeeper&#39;系统有百返回,说明zookeeper启动。linux上进程有5种状态:运行(正在运行或在运行队列中等待);中断度(休眠中, 受阻, 在等待某个条件的形成或接受到信号);不可中断(收到信号不唤醒和不可运行, 进程必须等...

  • 编码的作用和意义2021-02-04 10:07
    回答 7
    已采纳

    数字编码的作用和意义如下:1、归档整理方便,特别在电子管理系统中。2、数字编码更容易进行管理,无论谁进行的编码都是一样,管理方便,人员无论怎么换,程序和事务不会乱。3、从数字上能得到详细的对应信息,譬如年月日甚至时分秒、单位、部门、建档人等等...

  • 回答 0

  • net.core.netdev_max_backl2021-12-13 14:01
    回答 3

    TCP SYN_REVD, ESTABELLISHED 状态对应的队列TCP 建立连接时要经过 3 次握手,在客户端向服务器发起连接时,对于服务器而言,一个完整的连接建立过程,服务器会经历 2 种 TCP 状态:SYN_REVD, ESTABELLISHED对应也会维护两个队列:一个存放 SYN ...

  • 回答 3

    对于一个TCP连接,Server与Client需要通过三次握手来建立网络连接.当三次握手成功后,我们可以看到端口的状态由LISTEN转变为ESTABLISHED,接着这条链路上就可以开始传送数据了.每一个处于监听(Listen)状态的端口,都有自己的监听队列.监听队列的长度,与如下两方...

  • net.ipv4.tcp_abort_on_ove2021-12-09 14:50
    回答 5
    已采纳

    设置该参数为 1 时,当系统在短时间内收到了大量的请求,而相关的应用程序未能处理时,就会发送 Reset 包直接终止这些链接。建议通过优化应用程序的效率来提高处理能力,而不是简单地 Reset。默认值: 0。...

  • 回答 7

    *tcpsyncookies是一个开关,是否打开SYN Cookie功能,该功能可以防止部分SYN×××。tcpsynackretries和tcpsynretries定义SYN的重试次数。YN Cookie是对TCP服务器端的三次握手做一些修改,专门用来防范SYN Flood×××的一种手段。它的原理是,在TCP服务器接...

  • net.ipv4.tcp_max_syn_back2021-12-07 14:32
    回答 7
    已采纳

    该参数决定了系统中处于 SYN_RECV 状态的 TCP 连接数量。SYN_RECV 状态指的是当系统收到 SYN 后,作了 SYN+ACK 响应后等待对方回复三次握手阶段中的最后一个 ACK 的阶段。

  • 回答 6

    先重头检查一下是不是配置出现问题,不行的话重装软件试试

  • 回答 10

    首先是我们将鼠标移动到如下图所示的计算机的图标上,点击右键,选择管理。然后我们点击如下图界面中的服务和应用程序。接下来可以看到它下面有一个我们的目标——服务。服务的话它是按字母排列的,我们往下拉,找到Mysql服务。此时可以看到它是一个手动启动...

没有解决我的问题,去提问