两个进程交替打印AAAA、BBBB,使用定时器信号进行交替打印

题目:
创建两个进程交替打印AAAA和BBBB,使用定时器信号切换进行交替打印,注意:不是信号量处理

#include <stdio.h>
#include <sys/types.h>   //该头文件用于pid,getppid等
#include <signal.h>      //用于kill()等
#include <unistd.h>  //该头文件用于alarm()
#include <stdlib.h>   //该头文件用于pause()
pid_t pid;
//注册函数,用于循环输入A与B
void sigusr1_handler(int n){
    if(pid > 0)
        printf("AAAA\n");
    else
        printf("BBBB\n");
    alarm(1);   //睡眠--->信号
}

void sigalrm_handler(int n){
    if(pid > 0)
        kill(pid, SIGUSR1);  //———>>向子进程发送信号,输出BBBB
    else
        kill(getppid(),SIGUSR1);
}
int main(){
    // 注册处理函数绑定
    signal(SIGALRM, sigalrm_handler);
    signal(SIGUSR1, sigusr1_handler);
    pid = fork();
    if(pid > 0)      //父进程处理
        raise(SIGUSR1);  //先调用父进程发送信号进行AAAA的输出
    while(1)
        pause(); //pause()会令目前的进程暂停(进入睡眠状态), 直到被信号(signal)所中断.
    return 0;
}

备注:

1.函数名raise()
 功能向正在执行的程序发送一个信号
 用法int raise(int sig)
 表头文件#include <signal.h
头文件:#include <sys/types.h> #include <signal.h>


2.定义函数:int kill(pid_t pid, int sig);
函数说明:kill()可以用来送参数sig 指定的信号给参数pid 指定的进程。参数pid 有几种情况:
1、pid>0 将信号传给进程识别码为pid 的进程.
2、pid=0 将信号传给和目前进程相同进程组的所有进程
3、pid=-1 将信号广播传送给系统内所有的进程
4、pid<0 将信号传给进程组识别码为pid 绝对值的所有进程参数 sig 代表的信号编号可参考附录D
返回值:执行成功则返回0, 如果有错误则返回-1.

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是你需要的代码: ```c #include <stdio.h> #include <unistd.h> #include <sys/wait.h> void print_uppercase() { for (char c = 'A'; c <= 'Z'; c++) { printf("%c", c); fflush(stdout); // 刷新输出缓冲区 usleep(50000); // 等待 50ms } } void print_lowercase() { for (char c = 'a'; c <= 'z'; c++) { printf("%c", c); fflush(stdout); // 刷新输出缓冲区 usleep(50000); // 等待 50ms } } int main() { pid_t pid1, pid2; // 创建第一个子进程 pid1 = fork(); if (pid1 < 0) { printf("Error creating child process 1!\n"); return 1; } else if (pid1 == 0) { // 子进程 1 printf("Child process 1 (PID %d) created!\n", getpid()); print_uppercase(); } else { // 父进程 // 创建第二个子进程 pid2 = fork(); if (pid2 < 0) { printf("Error creating child process 2!\n"); return 1; } else if (pid2 == 0) { // 子进程 2 printf("Child process 2 (PID %d) created!\n", getpid()); print_lowercase(); } else { // 父进程 printf("Parent process (PID %d) created!\n", getpid()); // 等待两个进程结束 wait(NULL); wait(NULL); printf("\n"); for (int i = 1; i <= 26; i++) { printf("%d", i); fflush(stdout); // 刷新输出缓冲区 usleep(50000); // 等待 50ms } } } return 0; } ``` 这个程序使用了 `fork()` 函数创建了两个进程,一个子进程用于输出大写字母,另一个用于输出小写字母。父进程负责输出数字,并且在两个进程结束后才开始输出数字。 注意到在每次输出字符后,都使用了 `fflush(stdout)` 刷新了输出缓冲区,这是因为在输出字符后,输出结果并不会立刻显示在终端上,而是会先存储到缓冲区中,直到缓冲区满了或者使用 `fflush()` 函数刷新缓冲区后才会显示出来。为了让输出的字母和数字能够交错输出,我们在输出每个字符后都使用了 `usleep(50000)` 函数暂停了 50ms,这样就能够实现混合交错输出的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值