欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}

运行结果:
linux笔记

2.解引用空指针
代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int *p=NULL;
    *p=20;
    printf("p=%d\n",*p);
    return 0;
}

运行结果:
linux笔记
结果解析:程序运行结果是段错误

解引用空指针会有三种结果:

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;
}

运行结果
linux笔记
(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;
}

运行结果:
linux笔记
两次运行结果的解析:
变量定义到入口函数中成为栈上的变量了. 每个线程有自己独立的栈

执行结果的不一样,虽然这两个线程是同一个入口函数,但是如果是栈上的话,两个线程都拿到了变量count的初始值,都开始自己的count++,所以两个线程都是从0开始++,同时输出count=1,如果是全局的话,某一个线程把count的初始值拿到之后变为count=1,另一个线程因为共享同一虚拟地址空间,只能从1开始count++

相关标签: fwrite printf