linux相关代码程序,小而精悍

    技术2022-05-20  35

     

    #include <stdio.h>

    #include <stdlib.h>

    #include <unistd.h>

    #include <fcntl.h>

    #include <string.h> //strerror()

    #include <errno.h> //errno

     

     

    int main(void){

     

    int fd ;

    static const char* name="tmpfile.txt";

    // if( mknod(name,S_IFCHR | 0600 , (1<<8)| 3) == 0){

     

    fd = open(name , O_RDWR);

    unlink(name);

    printf("unlink/n");

    if( fd >= 0){

     

    dup2(fd , 0);

    dup2(fd , 1);

    dup2(fd , 2);

    if( fd >2 )

    close(fd);

    }

     

    // }

    /* 打印错误信息 */

    // printf("error: %s/n",strerror(errno));

    sleep(10);

    printf("done/n");

    exit(0);

    }

    说明:1、这里unlink用于删除一个现有的目录项,上面程序中调用unlink并不是立即删除文件(虽然在执行unlink函数后,在当前目录中已经看不到tmpfile.txt了),而是等待进程结束后才删除文件,释放文件占用的空间。可以通过df命令查看文件系统大小资源来分析unlink前后的变化。只有当文件的链接数为0时,才能够被删除,另一个条件就是当该文件被进程打开时,也不会被删除,而是要等到进程结束后,才删除。2、这里使用了dup2,它用于复制一个现有的文件描述符,类似的一个函数为dup,返回的新的文件描述符和原来的文件描述符指向同一个文件表项,所以就共享双方的文件标志(读、写、添写)和当前文件偏移量。上面的程序中dup2函数执行后,标准输出、标准输入、标准错误都会只和文件tmpfile.txt打交道,而和终端就没有交互了。

     

     

     

    #include <stdio.h>

    #include <stdlib.h>

    #include <string.h> //strchr()

     

    int main(void){

     

    char cmdline[] = "hello world , baby!";

    char* ptr = cmdline ;

    char *pos = strchr(ptr,'a');

     

    printf("*pos = %c /n" , *pos); //'a'

    // printf("*pos++ = %c /n ",*pos++); //'a'

    *pos++ =0;

     

    printf("cmdline = %s /n", cmdline); //hello world , b

     

    exit(0);

    }

    说明:1strchr用于在指定的字符串中查找第一个指定的字符的位置,返回的是对应的字符。

    1、第二个要注意的情况是:*pos++*++pos,的区别在于前者先执行*pos,再执行pos++,而后者就不一样,先执行++pos,再执行*pos,这里能够通过*pos++ =0;修改原先字符串中的字符,如果原先cmdlinechar*类型,就不能直接修改,会出现段错误。

     

    linux中可以通过/proc/cmdline获取内核命令行参数。

     

     

     

    #include <stdio.h>

    #include <stdlib.h>

    #include <string.h> //strcpy strncpy

     

    #define MAXLINE 100

     

    int main(void){

     

    //char str[] ="Android , a mazing platform!";

    char* str ="Android , a mazing platform!";

     

    char dest[MAXLINE];

    strcpy(dest , str ); //strcpy(char* to , char* from);

    puts(dest);

     

    /* the standard use of "strncpy" */

    char buf[10];

    strncpy( buf , "abcdefghefg" , sizeof(buf)-1 ); //strncpy(char* to ,const char* from, size_t n);

    buf[sizeof(buf)]=0;

    puts(buf);

     

    /* the use of strlcpy */

    char buffer[20];

    int src_len = strlcpy(buffer , str , sizeof(buffer)); //size_t strlcpy(char *dst, const char *src, size_t siz);

    if( src_len > strlen(buffer) )

    printf("truncated happened!/n");

    puts(buffer);

     

    char buff[20];

    //int snprintf(char *str, size_t size, const char *format, ...); 

    int len = snprintf(buff , sizeof(buff) , "This is String : %s" , "hello world!");

    puts(buff);

    exit(0);

     

    exit(0);

    }

    说明:strcpy可能造成to字符串因为长度不够而溢出的问题,直接将from对应的字符串拷贝到to字符串中;strncpy拷贝from字符串中的前n个字符到to字符串中,不保证to字符串的最后一个字符为结束符,这一点要非常小心;strlcpy函数就避免了strncpy中的这个缺陷,它拷贝src字符串中的最多siz-1个字符到dst字符串中,保证dst字符串以null结束,同时返回strlen(src),如果src的长度大于dst,则发生truncatesnprintfformat格式的字符串拷贝到str字符串中,至多拷贝size-1个字符,保证str字符串以null字符结束,如果format长度过长,则发生truncate,返回实际拷贝的字符数。

     

     

     

     

     

     

     

    #include <stdio.h> #include <stdlib.h> #define PRINT_FILE printf("%s/n",__FILE__) #define PRINT_FUNC printf("%s/n",__FUNCTION__) #define PRINT_LINE printf("%d/n",__LINE__) int main(void){ PRINT_FILE; PRINT_FUNC; PRINT_LINE; exit(0); }  

     说明:通过宏定义__FILE__、__FUNCTION__、__LINE__进行调试。

     

    #include <stdio.h> #include <stdlib.h> //strtoul int main(void){ char* str = "FF"; // unsigned long int strtoul(const char *nptr,char **endptr,int base); int num = strtoul(str , 0 , 16); printf("%d /n",num); exit(0); } #include <stdio.h> #include <stdlib.h> //strtoul int main(void){ char* str = "255"; int num = strtoul(str , 0 , 0); printf("0x%x /n",num); char* an ="/n" //C语言中还可以这样给字符指针赋值 "/n" " hello!/n"; puts(an); exit(0); }

    说明:strtoul把字符串对应的数字转化为对应进制的无符号长整数。第一个参数表示对应的字符串指针,第二个参数一般使用0,表示以null结尾,第三个参数表示对应的转化进制,0表示十进制,16表示十六进制。

     


    最新回复(0)