杂记 (3) —— C and linux

39 篇文章 0 订阅
13 篇文章 0 订阅

问题

github, C pthread, C pointer

  • 遇到一个奇怪的现象. 在移动硬盘中自己编译c程序得到的可执行文件没有可执行属性,使用root +x也不能改变他的属性. 当我把它放入自己电脑中的硬盘后,就可以chmod +x了.
    自己猜想这可能和文件系统相关.
fdisk -l
Device     Boot     Start       End   Sectors   Size Id Type
/dev/sda1  *         2048 167776255 167774208    80G  7 HPFS/NTFS/exFAT
/dev/sda2       167778302 976773119 808994818 385.8G  f W95 Ext'd (LBA)
/dev/sda5       167778304 323217075 155438772  74.1G  7 HPFS/NTFS/exFAT
/dev/sda6       438315008 708849663 270534656   129G  7 HPFS/NTFS/exFAT
/dev/sda7       708851712 976773119 267921408 127.8G  7 HPFS/NTFS/exFAT
/dev/sda8       430364672 438300671   7936000   3.8G 82 Linux swap / Solaris
/dev/sda9       323217408 430348287 107130880  51.1G 83 Linux

Partition 2 does not start on physical sector boundary.
Partition table entries are not in disk order.

Device     Boot Start       End   Sectors   Size Id Type
/dev/sdb1  *      256 976707583 976707328 465.7G  c W95 FAT32 (LBA)
  • 查看自己的github ID
    https://api.github.com/users/自己的用户名
  • /dev/stdin, /dev/stdout, /dev/stderr分别对应着/dev/fd/0, /dev/fd/1, /dev/fd/2
  • 编译出错:warning: implicit declaration of function ‘pthread_setconcurrency’
gcc -o prod_cos prod_cos.c -pthread
prod_cos.c: In functionmain’:
prod_cos.c:32:5: warning: implicit declaration of functionpthread_setconcurrency’ [-Wimplicit-function-declaration]
     pthread_setconcurrency(threads); 

查看/usr/include/pthread.h

 458 #ifdef __USE_UNIX98
 459 /* Determine level of concurrency.  */
 460 extern int pthread_getconcurrency (void) __THROW;
 461 
 462 /* Set new concurrency level to LEVEL.  */
 463 extern int pthread_setconcurrency (int __level) __THROW;
 464 #endif

所以我们需要自己定义__USE_UNIX98,具体可以这样:
在当前目录下写一个unix98.h, 在unix98.h中写入#define __USE_UNIX98
然后在#include <pthread>前加上 #include "unix98.h"

  • 获取线程的ID号
    499 #define __NR_gettid 178
    500 __SYSCALL(__NR_gettid, sys_gettid)

  • 怎样使用gdb()来看线程的栈空间
    运行相关的程序:./main
    查看其pid: ps aux|grep main
    运行gdb:

gdb 
attach pid
thread apply all bt
  • 用指针给数组填充0
#include <stdio.h>
int main(){
    int a[5]={1,2,3,4,5};
    int  *p=a;
    int dex=0;
    while((p+dex) <= &a[4]){
        printf("%p\n",(p+dex));
        *(p+dex) = 0;
        dex++;
    }
    p=NULL;
    int i;
    for(i=0;i<5;i++){
        printf("%d ",a[i]);
    }
    puts("");
    return 0;
}
./t
0x7fff100d6810
0x7fff100d6814
0x7fff100d6818
0x7fff100d681c
0x7fff100d6820
0 0 0 0 0 
  • 怎样给多维指针数组赋值NULL?
    一个例子:
#include <stdio.h>
#include <stdlib.h>

int main(){
    int *p[4][4][4] = {{{NULL}}};
    int *a = NULL;
    printf("the null pointer is %p.\n",a);
    int i,j,k;
        for(i=0;i<4;i++){
        for(j=0;j<4;j++){
            for(k=0;k<4;k++){
                printf("%p ",p[i][j][k]);
            }
            printf("\n");
        }
        puts("");
    }

        return 0;
}

运行:

./t3
the null pointer is (nil).
(nil) (nil) (nil) (nil) 
(nil) (nil) (nil) (nil) 
(nil) (nil) (nil) (nil) 
(nil) (nil) (nil) (nil) 

(nil) (nil) (nil) (nil) 
(nil) (nil) (nil) (nil) 
(nil) (nil) (nil) (nil) 
(nil) (nil) (nil) (nil) 

(nil) (nil) (nil) (nil) 
(nil) (nil) (nil) (nil) 
(nil) (nil) (nil) (nil) 
(nil) (nil) (nil) (nil) 

(nil) (nil) (nil) (nil) 
(nil) (nil) (nil) (nil) 
(nil) (nil) (nil) (nil) 
(nil) (nil) (nil) (nil)
  • 多次free释放指针会怎么样?
#include <stdio.h>
#include <stdlib.h>

int main(){
    int *p =(int *)malloc(sizeof(int));
    *p=12;
    printf("number is %d , this pointer is %p.\n",*p,p);
    free(p);
    printf("number is %d , this pointer is %p.\n",*p,p);
    return 0;
}
./t4
number is 12 , this pointer is 0x1b95010.
number is 0 , this pointer is 0x1b95010.

别以为这样就是安全的,在工程中他可能会导致系统产生的这样的错误信息: signal SIGABRT (多次释放内存)

记录

unix环境编程

  • 信号SIGSEGV
    某一个线程执行了无效指针访问
  • 不能被捕获的信号
    SIGKILL, SIGSTOP
  • sleep_us()
    睡眠单位是微秒。
  • system()的工作原理及其妙用 (摘自百度百科)
    system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
    system(“pause”)可以实现冻结屏幕,便于观察程序的执行结果;
    system(“CLS”)可以实现清屏操作;
    system(“color 3A”) 调用color函数可以改变控制台的前景色和背景,其中color后面的3是背景色代号,A是前景色代号

自己的vimrc:

set number
set backspace=2
set hlsearch
set ruler
set nu
set bg=dark
set tabstop=4
set noexpandtab
set softtabstop=4
set shiftwidth=4
set cindent
syntax on

关于多行缩进:
在visual模式 - visual block模式下选中多行,shift + ‘>’就能缩进。
命令

set noexpandtab
set softtabstop=4

和makefile的编写有关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值