#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <pthread.h> #include <semaphore.h> void * pthread_odd_function(void * arg); void * pthread_even_function(void * arg); pthread_mutex_t work_mutex; pthread_cond_t work_cond; #define MAX_COUNT 10 int count = 0; int main(int argc, char const *argv[]) { pthread_t pthread_odd; pthread_t pthread_even; pthread_attr_t pthread_attr; int res; res = pthread_attr_init(&pthread_attr);//init pthread attribute,step 1 if (res != 0){ perror("pthread_attr_init failed!"); exit(EXIT_FAILURE); } res = pthread_cond_init(&work_cond,NULL); if (res != 0){ perror("pthread_cond_init failed!"); exit(EXIT_FAILURE); } res = pthread_mutex_init(&work_mutex,NULL); if (res != 0){ perror("pthread_mutex_init failed!"); exit(EXIT_FAILURE); } pthread_attr_setdetachstate(&pthread_attr,PTHREAD_CREATE_DETACHED);//design pthread attribute step 2 res = pthread_create(&pthread_odd,&pthread_attr,pthread_odd_function,NULL);//step 3 if (res != 0){ perror("pthread_create failed!"); exit(EXIT_FAILURE); } res = pthread_create(&pthread_even,&pthread_attr,pthread_even_function,NULL); if (res != 0){ perror("pthread_create failed!"); exit(EXIT_FAILURE); } while(count < MAX_COUNT) ; //wait the two sons threads finished pthread_mutex_destroy(&work_mutex); pthread_cond_destroy(&work_cond); pthread_exit(NULL); return 0; } void * pthread_odd_function(void *arg)//step 4 { pthread_mutex_lock(&work_mutex); while(count < MAX_COUNT){ if (count % 2 == 1){ printf("the odd count is : %d\n", count); ++count; pthread_cond_signal(&work_cond);//in order to release the thread of even } else pthread_cond_wait(&work_cond,&work_mutex);//the pthread is blocked,wait for the condition } pthread_mutex_unlock(&work_mutex); } void * pthread_even_function(void *arg)//step 5 { pthread_mutex_lock(&work_mutex); while(count < MAX_COUNT){ if (count % 2 == 0){ printf("the even count is : %d\n", count); ++count; pthread_cond_signal(&work_cond);//in order to release the thread of odd } else pthread_cond_wait(&work_cond,&work_mutex);//wait the condition satisfied } pthread_mutex_unlock(&work_mutex); }给我讲一下这段代码
时间: 2023-06-19 13:06:16 浏览: 162
这段代码是一个线程同步的例子,它创建了两个线程,一个线程打印出所有奇数,另一个线程打印出所有偶数。具体来说,代码中使用了互斥锁和条件变量来保证线程同步。互斥锁的作用是保护共享资源,只允许一个线程访问该资源。条件变量用于线程之间的通信,当一个线程需要等待某个条件满足时,它会进入阻塞状态,等待其他线程发送信号通知它条件已满足。
在主函数中,先初始化了互斥锁和条件变量,然后创建了两个线程,并使用pthread_attr_setdetachstate函数将线程属性设置为PTHREAD_CREATE_DETACHED,表示线程被创建后马上就进入分离状态,不需要等待其他线程回收资源。接着主线程进入一个循环,等待两个子线程执行完毕。
在子线程中,先获取互斥锁,进入while循环,判断count是否小于最大值,如果是,则进入条件判断。奇数线程打印出奇数并将count加1,然后调用pthread_cond_signal函数发送信号通知偶数线程可以执行了。偶数线程同样进入条件判断,打印出偶数,将count加1,然后调用pthread_cond_signal函数通知奇数线程可以执行了。如果条件不满足,则调用pthread_cond_wait函数将线程阻塞,等待其他线程发送信号通知它条件已满足。最后释放互斥锁,线程结束。
值得注意的是,条件变量的使用必须与互斥锁一起使用,否则可能会出现竞争条件,导致程序出现错误。
相关问题
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <netinet/ip.h> #define PORT 9090 /* Changing this size will change the layout of the stack. * We have added 2 dummy arrays: in main() and myprintf(). * Instructors can change this value each year, so students * won’t be able to use the solutions from the past. * Suggested value: between 0 and 300 */ #ifndef DUMMY_SIZE #define DUMMY_SIZE 100 #endif char *secret = "A secret message\n"; unsigned int target = 0x11223344; void myprintf(char *msg) { uintptr_t framep; // Copy the ebp value into framep, and print it out asm("movl %%ebp, %0" : "=r"(framep)); printf("The ebp value inside myprintf() is: 0x%.8x\n", framep); /* Change the size of the dummy array to randomize the parameters for this lab. Need to use the array at least once */ char dummy[DUMMY_SIZE]; memset(dummy, 0, DUMMY_SIZE); // This line has a format string vulnerability printf(msg); printf("The value of the ’target’ variable (after): 0x%.8x\n", target); }
这段代码存在一个格式化字符串漏洞,容易受到攻击者的利用。攻击者可以通过特殊的格式化字符串来读取或写入内存中的任意位置。具体来说,攻击者可以在传递给myprintf()函数的字符串中添加%c或%s等特殊字符,来读取内存中的任意位置。攻击者也可以使用%hn或%n等格式化字符串,来将值写入内存中的任意位置。例如,攻击者可以使用以下格式化字符串来将0x11223344写入target变量的地址0x0804a028处:
./vulnerable $(python -c "print('\x28\xa0\x04\x08' + '%4c%hn'*2)")
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/can.h> #include <linux/can/raw.h> #define CAN_INTERFACE "can0" // CAN接口名称 #define CAN_ID 0x123 // CAN ID int main(void) { int s; // socket描述符 struct sockaddr_can addr; struct ifreq ifr; struct can_frame frame; int nbytes; // 创建socket s = socket(PF_CAN, SOCK_RAW, CAN_RAW); if(s < 0) { perror("socket PF_CAN failed"); return 1; } // 设置CAN接口 strcpy(ifr.ifr_name, CAN_INTERFACE); ioctl(s, SIOCGIFINDEX, &ifr); addr.can_family = PF_CAN; addr.can_ifindex = ifr.ifr_ifindex; bind(s, (struct sockaddr *)&addr, sizeof(addr)); // 发送CAN数据 frame.can_id = CAN_ID; frame.can_dlc = 2; frame.data[0] = 0x01; frame.data[1] = 0x02; nbytes = write(s, &frame, sizeof(struct can_frame)); if(nbytes != sizeof(struct can_frame)) { perror("write failed"); close(s); return 1; } // 接收CAN数据 nbytes = read(s, &frame, sizeof(struct can_frame)); if(nbytes < 0) { perror("read failed"); close(s); return 1; } printf("can_id = 0x%X, can_dlc = %d, data = %02X %02X\n", frame.can_id, frame.can_dlc, frame.data[0], frame.data[1]); close(s); return 0; }这个代码gcc编译不过,重新写一下呢?
这段代码的问题在于缺少头文件的引用,需要添加以下头文件:
```c
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
```
另外,建议在使用 ioctl 函数时加上错误处理,修改后的代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#define CAN_INTERFACE "can0" // CAN接口名称
#define CAN_ID 0x123 // CAN ID
int main(void) {
int s; // socket描述符
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
int nbytes;
// 创建socket
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
if(s < 0) {
perror("socket PF_CAN failed");
return 1;
}
// 设置CAN接口
strcpy(ifr.ifr_name, CAN_INTERFACE);
if(ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
perror("ioctl failed");
close(s);
return 1;
}
addr.can_family = PF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
if(bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind failed");
close(s);
return 1;
}
// 发送CAN数据
frame.can_id = CAN_ID;
frame.can_dlc = 2;
frame.data[0] = 0x01;
frame.data[1] = 0x02;
nbytes = write(s, &frame, sizeof(struct can_frame));
if(nbytes != sizeof(struct can_frame)) {
perror("write failed");
close(s);
return 1;
}
// 接收CAN数据
nbytes = read(s, &frame, sizeof(struct can_frame));
if(nbytes < 0) {
perror("read failed");
close(s);
return 1;
}
printf("can_id = 0x%X, can_dlc = %d, data = %02X %02X\n",
frame.can_id, frame.can_dlc, frame.data[0], frame.data[1]);
close(s);
return 0;
}
```
阅读全文
相关推荐
















