signal_test.c

本文介绍了一个使用C语言实现的简单程序,该程序通过信号处理函数来响应键盘中断(SIGINT)和退出请求(SIGQUIT)。当接收到SIGINT信号时,程序会输出“hello world!”;若接收到SIGQUIT,则输出“exit!”并终止进程。此外,还演示了如何通过父进程发送这两种信号给子进程。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <stdlib.h>

void myfunc(int sign)
{
    if(sign == SIGINT)
    {
        printf("hello world!\n");
    }
    if(sign == SIGQUIT)
    {
        printf("exit!\n");
	exit(1);
    }
}

int main()
{
    pid_t pid;
    int select;

    pid = fork();

    if(pid == 0)
    {
        signal(SIGINT,myfunc);
	signal(SIGQUIT,myfunc);
        pause();
    }
    if(pid > 0)
    {   
        scanf("%d",&select);
	if( select == 1)
	{
            kill(pid,SIGINT);
	}
	if(select == 2)
	{
	    kill(pid,SIGQUIT);
	}
    }
}

以下是producer_consumer_many.c的代码实现: ```c #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define BUFFER_SIZE 10 #define PRODUCER_NUM 3 #define CONSUMER_NUM 2 int buffer[BUFFER_SIZE]; int in = 0, out = 0; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t full = PTHREAD_COND_INITIALIZER; pthread_cond_t empty = PTHREAD_COND_INITIALIZER; void *producer(void *arg) { int id = (int)arg; while (1) { pthread_mutex_lock(&mutex); while ((in + 1) % BUFFER_SIZE == out) { printf("Producer %d: Buffer is full, waiting...\n", id); pthread_cond_wait(&full, &mutex); } int item = rand() % 100; buffer[in] = item; printf("Producer %d: Insert item %d at position %d\n", id, item, in); in = (in + 1) % BUFFER_SIZE; pthread_cond_signal(&empty); pthread_mutex_unlock(&mutex); sleep(1); } } void *consumer(void *arg) { int id = (int)arg; while (1) { pthread_mutex_lock(&mutex); while (in == out) { printf("Consumer %d: Buffer is empty, waiting...\n", id); pthread_cond_wait(&empty, &mutex); } int item = buffer[out]; printf("Consumer %d: Remove item %d from position %d\n", id, item, out); out = (out + 1) % BUFFER_SIZE; pthread_cond_signal(&full); pthread_mutex_unlock(&mutex); sleep(2); } } int main() { pthread_t producer_threads[PRODUCER_NUM]; pthread_t consumer_threads[CONSUMER_NUM]; int i; for (i = 0; i < PRODUCER_NUM; i++) { pthread_create(&producer_threads[i], NULL, producer, (void *)i); } for (i = 0; i < CONSUMER_NUM; i++) { pthread_create(&consumer_threads[i], NULL, consumer, (void *)i); } for (i = 0; i < PRODUCER_NUM; i++) { pthread_join(producer_threads[i], NULL); } for (i = 0; i < CONSUMER_NUM; i++) { pthread_join(consumer_threads[i], NULL); } return 0; } ``` 在该代码中,我们定义了一个缓冲区buffer,和两个指针in和out,分别表示生产者插入的位置和消费者取出的位置。 我们使用了互斥量mutex和条件变量full和empty来保证线程同步。当缓冲区满时,生产者等待full条件变量,当缓冲区为空时,消费者等待empty条件变量。 生产者使用while循环来检查缓冲区是否已满,如果已满则等待full条件变量。当缓冲区未满时,生产者插入一个随机数并更新in指针。然后发送empty条件变量,唤醒正在等待empty条件变量的消费者线程。 消费者使用while循环来检查缓冲区是否为空,如果为空则等待empty条件变量。当缓冲区不为空时,消费者从缓冲区中取出一个数并更新out指针。然后发送full条件变量,唤醒正在等待full条件变量的生产者线程。 在main函数中,我们创建了多个生产者和消费者线程,并使用pthread_join函数等待它们的结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值