linux笔记
程序员文章站
2022-06-03 13:18:27
...
1.输出信息到显示器的三种方法
#include<stdio.h>
#include<string.h>
int main()
{
const char*msg="hello fwrite\n";
fwrite(msg,strlen(msg),1,stdout);
printf("hello printf\n");
fprintf(stdout,"hello fprintf\n");
return 0;
}
运行结果:
2.解引用空指针
代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p=NULL;
*p=20;
printf("p=%d\n",*p);
return 0;
}
运行结果:
结果解析:程序运行结果是段错误
解引用空指针会有三种结果:
1.会使程序结束
2.进程收到信号会异常终止
3.会产生段错误
段错误(MMU异常)—->非法访问内存
MMU发现虚拟地址空间错误或此虚拟地址空间没有权限访问,此时MMU就会报告给操作系统内核,由操作系统给进程发送11号信号
3.线程中,栈上开辟的空间和全局变量的不同
(1)栈上
代码:
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
void*ThreadEnter(void*arg)
{
char*ID=(char*)arg;
int count=0;
while(1)
{
count++;
if(count>6)
pthread_exit(NULL);
printf("count=%d,ID=%s\n",count,ID);
sleep(1);
}
}
int main()
{
pthread_t tid1,tid2;
pthread_create(&tid1,NULL,ThreadEnter,"thread1");
pthread_create(&tid2,NULL,ThreadEnter,"thread2");
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
运行结果 (2)全局
代码
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
int count=0;
void*ThreadEnter(void*arg)
{
char*ID=(char*)arg;
while(1)
{
count++;
if(count>6)
pthread_exit(NULL);
printf("count=%d,ID=%s\n",count,ID);
sleep(1);
}
}
int main()
{
pthread_t tid1,tid2;
pthread_create(&tid1,NULL,ThreadEnter,"thread1");
pthread_create(&tid2,NULL,ThreadEnter,"thread2");
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
运行结果:
两次运行结果的解析:
变量定义到入口函数中成为栈上的变量了. 每个线程有自己独立的栈
执行结果的不一样,虽然这两个线程是同一个入口函数,但是如果是栈上的话,两个线程都拿到了变量count的初始值,都开始自己的count++,所以两个线程都是从0开始++,同时输出count=1,如果是全局的话,某一个线程把count的初始值拿到之后变为count=1,另一个线程因为共享同一虚拟地址空间,只能从1开始count++
上一篇: Docker入门教程