代码:#include<stdio.h> #include<signal.h> #include<unistd.h> #include<stdlib.h> void waiting(),stop(); int wait_mark; main() { int p1,p2; signal(SIGINT,stop); while((p1=fork())== -1); if(p1>0) {① while((p2=fork())== -1); if(p2>0) {② wait_mark=1; waiting(0); kill(p1,10); kill(p2,12); wait(); wait(); printf("parent proces is killed!\n"); exit(0); } else { wait_mark=1; signal(12,stop); waiting(); lockf(1,1,0); printf("child process 2 is killed by parent!\n"); lockf(1,0,0); exit(0); } } else { wait_mark=1; signal(10,stop); waiting(); lockf(1,1,0); printf("child process 1 is killed by parent!\n"); lockf(1,0,0); exit(0); } } void waiting() { while(wait_mark!=0); } void stop() { wait_mark=0; }。这段代码哪部分是同步P操作,那段是互斥P操作
时间: 2024-04-06 07:30:38 浏览: 20
在函数waiting()中的while循环是同步P操作,即等待信号量被释放。在函数stop()中的wait_mark=0语句是互斥P操作,即获取信号量并将其值减一。这段代码使用了一个整型变量wait_mark作为二元信号量,其值为1表示资源可用,值为0表示资源不可用。在等待资源时,进程需要执行同步P操作,即等待资源变为可用,而在释放资源时,进程需要执行互斥P操作,即获取资源并将其值减一。
相关问题
代码:#include<stdio.h> #include<signal.h> #include<unistd.h> #include<stdlib.h> void waiting(),stop(); int wait_mark; main() { int p1,p2; signal(SIGINT,stop); while((p1=fork())== -1); if(p1>0) {① while((p2=fork())== -1); if(p2>0) {② wait_mark=1; waiting(0); kill(p1,10); kill(p2,12); wait(); wait(); printf("parent proces is killed!\n"); exit(0); } else { wait_mark=1; signal(12,stop); waiting(); lockf(1,1,0); printf("child process 2 is killed by parent!\n"); lockf(1,0,0); exit(0); } } else { wait_mark=1; signal(10,stop); waiting(); lockf(1,1,0); printf("child process 1 is killed by parent!\n"); lockf(1,0,0); exit(0); } } void waiting() { while(wait_mark!=0); } void stop() { wait_mark=0; }。代码中waiting(0)和waiting有啥区别
代码中的 `waiting(0)` 和 `waiting()` 在语法上没有区别,两者都是调用 `waiting()` 函数。不过,在这个程序中,它们的作用是不同的。
`waiting(0)` 在父进程中被调用,它的作用是让父进程等待子进程终止。这是因为,在父进程中,我们希望等待两个子进程都终止之后再继续执行父进程的代码。
`waiting()` 在子进程中被调用,它的作用是让子进程等待接收到一个信号后再继续执行。这是因为,在子进程中,我们希望等待父进程发送一个信号,以便子进程可以终止。
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "MQTTClient.h" #include <stdint.h> #include <signal.h> /* sigaction */ #include <errno.h> #include "sqlite3.h" #include "pan_reg.h" #include "spi_func.h" #include "auxiliary.h" #if !defined(WIN32) #include <unistd.h> #else #include <windows.h> #endif #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <math.h> /* modf */ #include "cJSON.h" #include <fcntl.h> #include "uart.h" #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>
这是一段 C 语言的代码,包含了一些头文件的引用,如 pthread.h、stdio.h、stdlib.h、string.h、MQTTClient.h、stdint.h、signal.h、errno.h、sqlite3.h、netdb.h、sys/types.h、sys/socket.h、netinet/in.h、math.h、cJSON.h、fcntl.h 和 uart.h。这段代码中可能包含了一些线程库、网络库、消息队列、JSON 解析等相关的函数。具体实现需要查看代码的具体逻辑。
阅读全文