#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);
}
说明:1、strchr用于在指定的字符串中查找第一个指定的字符的位置,返回的是对应的字符。
1、第二个要注意的情况是:*pos++和*++pos,的区别在于前者先执行*pos,再执行pos++,而后者就不一样,先执行++pos,再执行*pos,这里能够通过*pos++ =0;修改原先字符串中的字符,如果原先cmdline是char*类型,就不能直接修改,会出现段错误。
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,则发生truncate;snprintf将format格式的字符串拷贝到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表示十六进制。