基于pthread_create,readlink,getpid等函数的学习与总结

pthread_create是UNIX环境创建线程函数
  
  具体格式:
    #include<pthread.h>
    int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void*(*start_rtn)(void*),void *restrict arg);
    返回值:若成功则返回0,否则返回出错编号
    返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于制定各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个无指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。
    linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。

#include <pthread.h>
  int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void), void *restrict arg);
  
  Returns: 0 if OK, error number on failure

由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间。restrict 数据类型不改变程序的语义。 编译器能通过作出 restrict 修饰的指针是存取对象的唯一方法的假设,更好地优化某些类型的例程。
    第一个参数为指向线程标识符的指针。
    第二个参数用来设置线程属性。
    第三个参数是线程运行函数的起始地址。
    最后一个参数是运行函数的参数。
    另外,在编译时注意加上-lpthread参数,以调用静态链接库。因为pthread并非Linux系统的默认库

===============================================================================linux关于readlink函数获取运行路径           
相关函数: stat, lstat, symlink
表头文件: #include <unistd.h>
定义函数:int  readlink(const  char *path,  char *buf, size_t  bufsiz);
函数说明:readlink()会将参数path的符号连接内容到参数buf所指的内存空间,返回的内容不是以NULL作字符串结尾,但会将字符串的字符数返回。若参数bufsiz小于符号连接的内容长度,过长的内容会被截断
  
返回值:
执行成功则传符号连接所指的文件路径字符串,失败返回-1, 错误代码存于errno
错误代码:
               EACCESS                  取文件时被拒绝,权限不够
               EINVAL                    参数bufsiz为负数
               EIO                         O存取错误
               ELOOP                     欲打开的文件有过多符号连接问题
               ENAMETOOLONG       参数path的路径名称太长
               ENOENT                   参数path所指定的文件不存在
               ENOMEM                   核心内存不足
               ENOTDIR                   参数path路径中的目录存在但却非真正的目录
例一:
#include <stdio.h>
#include <unistd.h>
#define PATH_MAX 1024
char * get_exe_path()
{
    static char buf[PATH_MAX];
    int i;
    int rslt = readlink("/proc/self/exe", buf, PATH_MAX);
    if (rslt < 0 || rslt >= PATH_MAX)
    {
        return NULL;
    }
    buf[rslt] = '/0';
    for (i = rslt; i >= 0; i--)
    {
        printf("buf[%d] %c/n", i, buf);
        if (buf == '/')
        {
            buf[i + 1] = '/0';
            break;
        }
    }
    return buf;
}
int main(int argc, char ** argv)
{
    printf("%s/n", get_exe_path());
    return 0;
}

===============================================================================

  getpid 取得进程识别码
  
  相关函数: fork,kill,getpid  表头文件: #include<unistd.h>  

定义函数: pid_t getpid(void);  

函数说明:  
  getpid()用来取得目前进程的进程识别码,许多程序利用取到的  此值来建立临时文件,以避免临时文件相同带来的问题。  

返回值: 目前进程的进程识别码  

范例:  
  #include<unistd.h>  
  main()  
  {  
  printf(“pid=%d/n”,getpid());  
  }  

执行:  
  pid=1494 /*每次执行结果都不一定相同*/

===============================================================================
  
  strrchr()函数
  
  定义和用法           
  strrchr()函数的作用是:查找一个字符串在另一个字符串中末次出现的位置,并返回从字符串中的这个位置起, 一直到字符串结束的所有字符。  如果未能找到指定字符,那么函数将返回NULL。

语法
  char *strrchr(char *str, char c);

例子
  #include <string.h>  
  #include <stdio.h>  
  int main(void)  
    char string[16];
    char *ptr, c = 'r';

  strcpy(string, "This is a string");
    ptr = strrchr(string, c);

  if (ptr)
             printf("The character %c is at position: %d/n", c, ptr-string);
    else
             printf("The character was not found/n");
    return 0;  
  }  

运行结果是:The character r is at position:12

===============================================================================

strstr()函数用法
  
c++函数原型:
const char * strstr ( const char * str1, const char * str2 );
char * strstr ( char * str1, const char * str2 );

C函数原型:
char * strstr ( const char *, const char * );
a字符串里 查看是否有b字符串,
有则 从首次发现b字符串处 返回 a字符串。
没有则输出 null
例子:
char st[]="abc 1234 xyz";
printf("%s",strstr(st,"34") );

打印出:
34 xyz

(0)

相关推荐

  • 使用pthread库实现openssl多线程ssl服务端和客户端

    服务端代码如下: 复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <memory.h>#include <errno.h>#ifndef    _WIN32#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#inclu

  • pthread_cond_wait() 用法深入分析

    很久没看APUE,今天一位朋友问道关于一个mutex的问题,又翻到了以前讨论过的东西,为了不让自己忘记,把曾经的东西总结一下.先大体看下网上很多地方都有的关于pthread_cond_wait()的说明: 条件变量   条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起:另一个线程使"条件成立"(给出条件成立信号).为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起. 1.创建和注销   条件变量和互

  • undefined reference to 'pthread_create'的解决方法

    照着GUN/Linux编程指南中的一个例子输入编译,结果出现如下错误: undefined reference to 'pthread_create'undefined reference to 'pthread_join' 问题原因:    pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库. 问题解决:    在

  • 基于pthread_create,readlink,getpid等函数的学习与总结

    pthread_create是UNIX环境创建线程函数     具体格式:   #include<pthread.h>   int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void*(*start_rtn)(void*),void *restrict arg);   返回值:若成功则返回0,否则返回出错编号   返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID.att

  • PHP中基于perl的正则表达式处理函数

    前面我们已经学习了正则表达式的基础语法,包括了定界符.原子.元字符和模式修正 符.实际上正则表达式想要起作用的话,就必须借用正则表达式处理函数.本节我们就来介绍一下PHP中基于perl的正则表达式处理函数,主要包含了分割, 匹配,查找,替换等等处理操作,依旧是配合示例讲解,让我们开始吧. 和正则表达式一样,正则表达式处理函数不能够独立使用,而这必须相结合,才能够完成特定的功能.在前面我们也说过,基于perl的正则表达式要快于POXIS正则表达式处理函数,所以我们只介绍以preg开头的基于perl

  • 在Python中画图(基于Jupyter notebook的魔法函数)

    这篇文章主要介绍了在Python中画图(基于Jupyter notebook的魔法函数),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先展示一段相关的代码: #we test the accuracy of knn and find the k which makes the biggest accuracy k_range=list(range(1,26))#[1,25] scores=[] for k in k_range: knn=KN

  • 基于keras中的回调函数用法说明

    keras训练 fit( self, x, y, batch_size=32, nb_epoch=10, verbose=1, callbacks=[], validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None ) 1. x:输入数据.如果模型只有一个输入,那么x的类型是numpy array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应

  • 基于Python 的语音重采样函数解析

    因为工作中会经常遇到不同采样率的声音文件的问题,特意写了一下重采样的程序. 原理就是把采样点转换到时间刻度之后再进行插值,经过测试,是没有问题的. #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 17-7-21 下午2:32 # @Author : Lei.Jinggui # @Site : http://blog.csdn.net/lccever # @File : Resample.py # @Software: PyCharm

  • PHP基于Closure类创建匿名函数的方法详解

    本文实例讲述了PHP基于Closure类创建匿名函数的方法.分享给大家供大家参考,具体如下: Closure 类 用于代表匿名函数的类. 匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象.在过去,这个类被认为是一个实现细节,但现在可以依赖它做一些事情.自 PHP 5.4 起,这个类带有一些方法,允许在匿名函数创建后对其进行更多的控制. 这个类不能实例化,里面主要有两个方法,都用来复制闭包,一个静态一个动态,下面分别详细讲解下这两个不好理解的方法. Closure::bind publ

  • PHP基于数组实现的分页函数实例

    分页功能是PHP程序设计中非常常见的功能,不同于以往的,今天本文介绍的是PHP基于数组实现的分页函数. 关于数组的分页函数,用数组进行分页的好处是可以方便的进行联合多表查询,只需要将查询的结果放在数组中就可以了以下是数组分页的函数,函数page_array用于数组的分页,函数show_array用于分页函数的操作及显示,需要配合使用.两个函数通过全局变量$countpage发生联系,此变量用于跟踪总页码数. 具体实例代码如下: <?php /** * 数组分页函数 核心函数 array_slic

  • 基于numpy中的expand_dims函数用法

    常见的一种应用场景: 条件:假设A的shape为[4, 2],B的shape为[5, 2] 目的:实现A中的每一行, 减去B中的所有行(broadcast操作). 实现: A1 = np.expand_dims(A, -2) => A1的shape变为[4, 1, 2] B1 = np.expand_dims(B, 0) => B1的shape变为[1, 5, 2] A1 - B1 其他示例: wh = np.random.randint(1,3, size=(4,2)) np.expand_

  • Javascript函数技巧学习

    目录 前言 1. 缓存函数 2. 将dev-point转换为devPoint 3. 自定义函数判断 4. JS运行环境 前言 阅读代码是提高编码水平的好方法,优秀的源代码就像一部文学巨作,开拓思维,提供启示.最近在阅读vue2的源代码,学到了很多JS的编码技巧,后续陆续分享出来供参考,顺便总结一下代码阅读成果. 1. 缓存函数 先来看一个需求,假设有一个逻辑复杂的函数 superComputed 执行很费时间,如果每次使用都去计算一次,就会给用户带来很长的等待.这个时候需要考虑将计算结果缓存起来

  • C++函数模板学习示例教程指南

    目录 C++函数模板学习指南 1. 函数模板的定义 2. 函数模板的使用 3. 函数模板的特化 4. 函数模板的偏特化 6. 非类型模板参数 7. 函数模板的局限性 总结 C++函数模板学习指南 C++函数模板是一种高效的代码复用机制,它允许我们定义一种可以用于多种类型的函数,而不必为每种类型都编写一个函数.本篇文章将介绍C++函数模板的基本使用.我们将逐步讨论函数模板的定义.使用.特化和偏特化. 1. 函数模板的定义 函数模板的定义基本语法如下: template <typename T>

随机推荐