#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<string.h> #include<pthread.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int i; //需要开启多进程的函数 void * fun_1(void * args) { for(i=0;i<10;i++) { sleep(2); pthread_mutex_lock(&mutex);//加锁 printf("1xianchenshangsuo\n"); printf("i=%d\n",i); pthread_mutex_unlock(&mutex);//解锁 printf("1xianchenjiesuo\n"); } return 0; } //需要开启多进程的函数 void * fun_2(void * args) { for(i=0;i<10;i++) { sleep(2); pthread_mutex_lock(&mutex);//加锁 printf("2xianchenshangsuo\n"); printf("i=%d\n",i); pthread_mutex_unlock(&mutex);//解锁 printf("2xianchenjiesuo\n"); } return 0; } int main() { pthread_t id[2]; //创建线程 pthread_create(&id[0],NULL,fun_1,NULL); pthread_create(&id[1],NULL,fun_2,NULL); //等待线程的结束 pthread_join(id[0],NULL); pthread_join(id[1],NULL); }是什么意思
时间: 2024-03-11 07:43:49 浏览: 85
这段代码使用了 POSIX 线程库实现了两个线程交替打印数字的功能。其中 `pthread_mutex_t mutex` 是一个互斥锁,用于保护打印操作的互斥访问。函数 `fun_1` 和 `fun_2` 中使用了互斥锁,分别打印数字并对打印操作进行加锁和解锁。`main` 函数中创建了两个线程,分别执行 `fun_1` 和 `fun_2`,并通过 `pthread_join` 等待两个线程的结束。整个程序的执行过程如下:
1. `main` 函数创建两个线程,分别执行 `fun_1` 和 `fun_2`。
2. `fun_1` 线程执行打印操作前,先对互斥锁进行加锁。
3. `fun_1` 线程打印数字,然后对互斥锁进行解锁。
4. `fun_2` 线程执行打印操作前,先对互斥锁进行加锁。
5. `fun_2` 线程打印数字,然后对互斥锁进行解锁。
6. 重复步骤 2-5,直到两个线程分别打印 10 个数字后退出。
由于两个线程对互斥锁的访问是互斥的,因此可以保证每次只有一个线程打印数字,从而实现了交替打印的效果。
相关问题
修改#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <net/if.h> #include <arpa/inet.h> int main() { int fd; struct ifreq ifr; fd = socket(AF_INET, SOCK_DGRAM, 0); ifr.ifr_addr.sa_family = AF_INET; //strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1); strncpy(ifr.ifr_name, "enp3s0", IFNAMSIZ-1); ioctl(fd, SIOCGIFHWADDR, &ifr); close(fd); unsigned char *mac = (unsigned char *) ifr.ifr_hwaddr.sa_data; printf("MAC Address: %02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); return 0; }获取IP地址
你可以使用SIOCGIFADDR命令来获取网络接口的IP地址,需要将ifr.ifr_addr.sa_family设置为AF_INET,然后调用ioctl函数来获取IP地址。下面是一个示例代码:
```
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>
int main() {
int fd;
struct ifreq ifr;
fd = socket(AF_INET, SOCK_DGRAM, 0);
ifr.ifr_addr.sa_family = AF_INET;
//strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
strncpy(ifr.ifr_name, "enp3s0", IFNAMSIZ-1);
ioctl(fd, SIOCGIFADDR, &ifr);
close(fd);
struct sockaddr_in* addr = (struct sockaddr_in*)&ifr.ifr_addr;
char* ip = inet_ntoa(addr->sin_addr);
printf("IP Address: %s\n", ip);
return 0;
}
```
其中,inet_ntoa函数用于将网络字节序的IP地址转换为字符串格式。
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <pthread.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <ctype.h> #include <sys/pps.h> #include <sys/types.h> #include "camera.h" #include <encoder.h> #include "ppsFunc.h" #include "timeDiff.h"
这是一段C语言的代码,使用了一些系统库和自定义头文件。其中包括了网络编程相关的库,如sys/socket.h和netinet/in.h,以及多线程相关的库pthread.h。另外还有一些自定义的头文件,如camera.h和encoder.h,可能是该程序所需的一些外部依赖。该程序可能是一个视频流的采集和编码程序,同时还使用了PPS和时间差等功能。
阅读全文
相关推荐
















