歡迎您光臨本站 註冊首頁

linux常用c函數 進程操作篇

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  

       atexit(設置程序正常結束前調用的函數)

  相關函數  _exit,exit,on_exit

  表頭文件  #include<stdlib.h>

  定義函數  int atexit (void (*function)(void));

  函數說明  atexit()用來設置一個程序正常結束前調用的函數。當程序通過調用exit()或從main中返回時,參數function所指定的函數會先被調用,然後才真正由exit()結束程序。

  返回值  如果執行成功則返回0,否則返回-1,失敗原因存於errno中。

  範例  #include<stdlib.h>

  void my_exit(void)

  {

  printf(“before exit () !\n”);

  }

  main()

  {

  atexit (my_exit);

  exit(0);

  }

  執行  before exit()!

 

 

  execl(執行文件)

  相關函數  fork,execle,execlp,execv,execve,execvp

  表頭文件  #include<unistd.h>

  定義函數  int execl(const char * path,const char * arg,....);

  函數說明  execl()用來執行參數path字元串所代表的文件路徑,接下來的參數代表執行該文件時傳遞過去的argv(0)、argv[1]……,最後一個參數必須用空指針(NULL)作結束。

  返回值  如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno中。

  範例  #include<unistd.h>

  main()

  {

  execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char * )0);

  }

  執行  /*執行/bin/ls -al /etc/passwd */

  -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

 

 

  execlp(從PATH 環境變數中查找文件並執行)

  相關函數  fork,execl,execle,execv,execve,execvp

  表頭文件  #include<unistd.h>

  定義函數  int execlp(const char * file,const char * arg,……);

  函數說明  execlp()會從PATH 環境變數所指的目錄中查找符合參數file的文件名,找到后便執行該文件,然後將第二個以後的參數當做該文件的argv[0]、argv[1]……,最後一個參數必須用空指針(NULL)作結束。

  返回值  如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。

  錯誤代碼  參考execve()。

  範例  /* 執行ls -al /etc/passwd execlp()會依PATH 變數中的/bin找到/bin/ls */

  #include<unistd.h>

  main()

  {

  execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);

  }

  執行  -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

 

 

  execv(執行文件)

  相關函數  fork,execl,execle,execlp,execve,execvp

  表頭文件  #include<unistd.h>

  定義函數  int execv (const char * path, char * const argv[ ]);

  函數說明  execv()用來執行參數path字元串所代表的文件路徑,與execl()不同的地方在於execve()只需兩個參數,第二個參數利用數組指針來傳遞給執行文件。

  返回值  如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。

  錯誤代碼  請參考execve()。

  範例  /* 執行/bin/ls -al /etc/passwd */

  #include<unistd.h>

  main()

  {

  char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) }};

  execv(“/bin/ls”,argv);

  }

  執行  -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

 

 

  execve(執行文件)

  相關函數  fork,execl,execle,execlp,execv,execvp

  表頭文件  #include<unistd.h>

  定義函數  int execve(const char * filename,char * const argv[ ],char * const envp[ ]);

  函數說明  execve()用來執行參數filename字元串所代表的文件路徑,第二個參數系利用數組指針來傳遞給執行文件,最後一個參數則為傳遞給執行文件的新環境變數數組。

  返回值  如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。

  錯誤代碼  EACCES

  1. 欲執行的文件不具有用戶可執行的許可權。

  2. 欲執行的文件所屬的文件系統是以noexec 方式掛上。

  3.欲執行的文件或script翻譯器非一般文件。

  EPERM

  1.進程處於被追蹤模式,執行者並不具有root許可權,欲執行的文件具有SUID 或SGID 位。

  2.欲執行的文件所屬的文件系統是以nosuid方式掛上,欲執行的文件具有SUID 或SGID 位元,但執行者並不具有root許可權。

  E2BIG 參數數組過大

  ENOEXEC 無法判斷欲執行文件的執行文件格式,有可能是格式錯誤或無法在此平台執行。

  EFAULT 參數filename所指的字元串地址超出可存取空間範圍。

  ENAMETOOLONG 參數filename所指的字元串太長。

  ENOENT 參數filename字元串所指定的文件不存在。

  ENOMEM 核心內存不足

  ENOTDIR 參數filename字元串所包含的目錄路徑並非有效目錄

  EACCES 參數filename字元串所包含的目錄路徑無法存取,許可權不足

  ELOOP 過多的符號連接

  ETXTBUSY 欲執行的文件已被其他進程打開而且正把數據寫入該文件中

  EIO I/O 存取錯誤

  ENFILE 已達到系統所允許的打開文件總數。

  EMFILE 已達到系統所允許單一進程所能打開的文件總數。

  EINVAL 欲執行文件的ELF執行格式不只一個PT_INTERP節區

  EISDIR ELF翻譯器為一目錄

  ELIBBAD ELF翻譯器有問題。

  範例  #include<unistd.h>

  main()

  {

  char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char *)0};

  char * envp[ ]={“PATH=/bin”,0}

  execve(“/bin/ls”,argv,envp);

  }

  執行  -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

 

 

  execvp(執行文件)

  相關函數  fork,execl,execle,execlp,execv,execve

  表頭文件  #include<unistd.h>

  定義函數  int execvp(const char *file ,char * const argv []);

  函數說明  execvp()會從PATH 環境變數所指的目錄中查找符合參數file 的文件名,找到后便執行該文件,然後將第二個參數argv傳給該欲執行的文件。

  返回值  如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno中。

  錯誤代碼  請參考execve()。

  範例  /*請與execlp()範例對照*/

  #include<unistd.h>

  main()

  {

  char * argv[ ] ={ “ls”,”-al”,”/etc/passwd”,0};

  execvp(“ls”,argv);

  }

  執行  -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

 

   exit(正常結束進程)

  相關函數  _exit,atexit,on_exit

  表頭文件  #include<stdlib.h>

  定義函數  void exit(int status);

  函數說明  exit()用來正常終結目前進程的執行,並把參數status返回給父進程,而進程所有的緩衝區數據會自動寫回並關閉未關閉的文件。

  返回值

  範例  參考wait()

  _

 

 

  exit(結束進程執行)

  相關函數  exit,wait,abort

  表頭文件  #include<unistd.h>

  定義函數  void _exit(int status);

  函數說明  _exit()用來立刻結束目前進程的執行,並把參數status返回給父進程,並關閉未關閉的文件。此函數調用后不會返回,並且會傳遞SIGCHLD信號給父進程,父進程可以由wait函數取得子進程結束狀態。

  返回值

  附加說明  _exit()不會處理標準I/O 緩衝區,如要更新緩衝區請使用exit()。

 

 

  vfork(建立一個新的進程)

  相關函數  wait,execve

  表頭文件  #include<unistd.h>

  定義函數  pid_t vfork(void);

  函數說明  vfork()會產生一個新的子進程,其子進程會複製父進程的數據與堆棧空間,並繼承父進程的用戶代碼,組代碼,環境變數、已打開的文件代碼、工作目錄和資源限制等。Linux 使用copy-on-write(COW)技術,只有當其中一進程試圖修改欲複製的空間時才會做真正的複製動作,由於這些繼承的信息是複製而來,並非指相同的內存空間,因此子進程對這些變數的修改和父進程並不會同步。此外,子進程不會繼承父進程的文件鎖定和未處理的信號。注意,Linux不保證子進程會比父進程先執行或晚執行,因此編寫程序時要留意

  死鎖或競爭條件的發生。

  返回值  如果vfork()成功則在父進程會返回新建立的子進程代碼(PID),而在新建立的子進程中則返回0。如果vfork 失敗則直接返回-1,失敗原因存於errno中。

  錯誤代碼  EAGAIN 內存不足。ENOMEM 內存不足,無法配置核心所需的數據結構空間。

  範例  #include<unistd.h>

  main()

  {

  if(vfork() = =0)

  {

  printf(“This is the child process\n”);

  }else{

  printf(“This is the parent process\n”);

  }

  }

  執行  this is the parent process

  this is the child process

 

 

  getpgid(取得進程組識別碼)

  相關函數  setpgid,setpgrp,getpgrp

  表頭文件  #include<unistd.h>

  定義函數  pid_t getpgid( pid_t pid);

  函數說明  getpgid()用來取得參數pid 指定進程所屬的組識別碼。如果參數pid為0,則會取得目前進程的組識別碼。

  返回值  執行成功則返回組識別碼,如果有錯誤則返回-1,錯誤原因存於errno中。

  錯誤代碼  ESRCH 找不到符合參數pid 指定的進程。

  範例  /*取得init 進程(pid=1)的組識別碼*/

  #include<unistd.h>

  mian()

  {

  printf(“init gid = %d\n”,getpgid(1));

  }

  執行  init gid = 0

 

 

  getpgrp(取得進程組識別碼)

  相關函數  setpgid,getpgid,getpgrp

  表頭文件  #include<unistd.h>

  定義函數  pid_t getpgrp(void);

  函數說明  getpgrp()用來取得目前進程所屬的組識別碼。此函數相當於調用getpgid(0);

  返回值  返回目前進程所屬的組識別碼。

  範例  #include<unistd.h>

  main()

  {

  printf(“my gid =%d\n”,getpgrp());

  }

  執行  my gid =29546

 

 

  getpid(取得進程識別碼)

  相關函數  fork,kill,getpid

  表頭文件  #include<unistd.h>

  定義函數  pid_t getpid(void);

  函數說明  getpid()用來取得目前進程的進程識別碼,許多程序利用取到的此值來建立臨時文件,以避免臨時文件相同帶來的問題。

  返回值  目前進程的進程識別碼

  範例  #include<unistd.h>

  main()

  {

  printf(“pid=%d\n”,getpid());

  }

  執行  pid=1494 /*每次執行結果都不一定相同*/

 

 

     getppid(取得父進程的進程識別碼)

  相關函數  fork,kill,getpid

  表頭文件  #include<unistd.h>

  定義函數  pid_t getppid(void);

  函數說明  getppid()用來取得目前進程的父進程識別碼。

  返回值  目前進程的父進程識別碼。

  範例  #include<unistd.h>

  main()

  {

  printf(“My parent ‘pid =%d\n”,getppid());

  }

  執行  My parent pid =463

  

 

      getpriority(取得程序進程執行優先權)

  相關函數  setpriority,nice

  表頭文件  #include<sys/time.h>

  #include<sys/resource.h>

  定義函數  int getpriority(int which,int who);

  函數說明  getpriority()可用來取得進程、進程組和用戶的進程執行優先權。

  參數  which有三種數值,參數who 則依which值有不同定義

  which who 代表的意義

  PRIO_PROCESS who 為進程識別碼

  PRIO_PGRP who 為進程的組識別碼

  PRIO_USER who 為用戶識別碼

  此函數返回的數值介於-20 至20之間,代表進程執行優先權,數值越低代表有較高的優先次序,執行會較頻繁。

  返回值  返回進程執行優先權,如有錯誤發生返回值則為-1 且錯誤原因存於errno。

  附加說明  由於返回值有可能是-1,因此要同時檢查errno是否存有錯誤原因。最好在調用次函數前先清除errno變數。

  錯誤代碼  ESRCH 參數which或who 可能有錯,而找不到符合的進程。EINVAL 參數which 值錯誤。

  

 

       nice(改變進程優先順序)

  相關函數  setpriority,getpriority

  表頭文件  #include<unistd.h>

  定義函數  int nice(int inc);

  函數說明  nice()用來改變進程的進程執行優先順序。參數inc數值越大則優先順序排在越後面,即表示進程執行會越慢。只有超級用戶才能使用負的inc 值,代表優先順序排在前面,進程執行會較快。

  返回值  如果執行成功則返回0,否則返回-1,失敗原因存於errno中。

  錯誤代碼  EPERM 一般用戶企圖轉用負的參數inc值改變進程優先順序。

  on_exit(設置程序正常結束前調用的函數)

  相關函數  _exit,atexit,exit

  表頭文件  #include<stdlib.h>

  定義函數  int on_exit(void (* function)(int, void*),void *arg);

  函數說明  on_exit()用來設置一個程序正常結束前調用的函數。當程序通過調用exit()或從main中返回時,參數function所指定的函數會先被調用,然後才真正由exit()結束程序。參數arg指針會傳給參數function函數,詳細情況請見範例。

  返回值  如果執行成功則返回0,否則返回-1,失敗原因存於errno中。

  附加說明

  範例  #include<stdlib.h>

  void my_exit(int status,void *arg)

  {

  printf(“before exit()!\n”);

  printf(“exit (%d)\n”,status);

  printf(“arg = %s\n”,(char*)arg);

  }

  main()

  {

  char * str=”test”;

  on_exit(my_exit,(void *)str);

  exit(1234);

  }

  執行  before exit()!

  exit (1234)

  arg = test

   

       setpgid(設置進程組識別碼)

  相關函數  getpgid,setpgrp,getpgrp

  表頭文件  #include<unistd.h>

  定義函數  int setpgid(pid_t pid,pid_t pgid);

  函數說明  setpgid()將參數pid 指定進程所屬的組識別碼設為參數pgid 指定的組識別碼。如果參數pid 為0,則會用來設置目前進程的組識別碼,如果參數pgid為0,則會以目前進程的進程識別碼來取代。

  返回值  執行成功則返回組識別碼,如果有錯誤則返回-1,錯誤原因存於errno中。

  錯誤代碼  EINVAL 參數pgid小於0。

  EPERM 進程許可權不足,無法完成調用。

  ESRCH 找不到符合參數pid指定的進程。

  

 

         setpgrp(設置進程組識別碼)

  相關函數  getpgid,setpgid,getpgrp

  表頭文件  #include<unistd.h>

  定義函數  int setpgrp(void);

  函數說明  setpgrp()將目前進程所屬的組識別碼設為目前進程的進程識別碼。此函數相當於調用setpgid(0,0)。

  返回值  執行成功則返回組識別碼,如果有錯誤則返回-1,錯誤原因存於errno中。

  

 

       setpriority(設置程序進程執行優先權)

  相關函數  getpriority,nice

  表頭文件  #include<sys/time.h>

  #include<sys/resource.h>

  定義函數  int setpriority(int which,int who, int prio);

  函數說明  setpriority()可用來設置進程、進程組和用戶的進程執行優先權。參數which有三種數值,參數who 則依which值有不同定義

  which who 代表的意義

  PRIO_PROCESS who為進程識別碼

  PRIO_PGRP who 為進程的組識別碼

  PRIO_USER who為用戶識別碼

  參數prio介於-20 至20 之間。代表進程執行優先權,數值越低代表有較高的優先次序,執行會較頻繁。此優先權默認是0,而只有超級用戶(root)允許降低此值。

  返回值  執行成功則返回0,如果有錯誤發生返回值則為-1,錯誤原因存於errno。

  ESRCH 參數which或who 可能有錯,而找不到符合的進程

  EINVAL 參數which值錯誤。

  EPERM 許可權不夠,無法完成設置

  EACCES 一般用戶無法降低優先權

  

 

        system(執行shell 命令)

  相關函數  fork,execve,waitpid,popen

  表頭文件  #include<stdlib.h>

  定義函數  int system(const char * string);

  函數說明  system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字元串所代表的命令,此命令執行完后隨即返回原調用的進程。在調用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。

  返回值  如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string為空指針(NULL),則返回非零值。如果system()調用成功則最後會返回執行shell命令后的返回值,但是此返回值也有可能為system()調用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。

  附加說明  在編寫具有SUID/SGID許可權的程序時請勿使用system(),system()會繼承環境變數,通過環境變數可能會造成系統安全的問題。

  範例  #include<stdlib.h>

  main()

  {

  system(“ls -al /etc/passwd /etc/shadow”);

  }

  執行  -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

  -r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow

  

 

      wait(等待子進程中斷或結束)

  相關函數  waitpid,fork

  表頭文件  #include<sys/types.h>

  #include<sys/wait.h>

  定義函數  pid_t wait (int * status);

  函數說明  wait()會暫時停止目前進程的執行,直到有信號來到或子進程結束。如果在調用wait()時子進程已經結束,則wait()會立即返回子進程結束狀態值。子進程的結束狀態值會由參數status 返回,而子進程的進程識別碼也會一快返回。如果不在意結束狀態值,則

  參數  status可以設成NULL。子進程的結束狀態值請參考waitpid()。

  返回值  如果執行成功則返回子進程識別碼(PID),如果有錯誤發生則返回-1。失敗原因存於errno中。

  附加說明

  範例  #include<stdlib.h>

  #include<unistd.h>

  #include<sys/types.h>

  #include<sys/wait.h>

  main()

  {

  pid_t pid;

  int status,i;

  if(fork()= =0){

  printf(“This is the child process .pid =%d\n”,getpid());

  exit(5);

  }else{

  sleep(1);

  printf(“This is the parent process ,wait for child...\n”;

  pid=wait(&status);

  i=WEXITSTATUS(status);

  printf(“child’s pid =%d .exit status=^d\n”,pid,i);

  }

  }

  執行  This is the child process.pid=1501

  This is the parent process .wait for child...

  child’s pid =1501,exit status =5

  

 

        waitpid(等待子進程中斷或結束)

  相關函數  wait,fork

  表頭文件  #include<sys/types.h>

  #include<sys/wait.h>

  定義函數  pid_t waitpid(pid_t pid,int * status,int options);

  函數說明  waitpid()會暫時停止目前進程的執行,直到有信號來到或子進程結束。如果在調用wait()時子進程已經結束,則wait()會立即返回子進程結束狀態值。子進程的結束狀態值會由參數status返回,而子進程的進程識別碼也會一快返回。如果不在意結束狀態值,則參數status可以設成NULL。參數pid為欲等待的子進程識別碼,其他數值意義如下:

  pid<-1 等待進程組識別碼為pid絕對值的任何子進程。

  pid=-1 等待任何子進程,相當於wait()。

  pid=0 等待進程組識別碼與目前進程相同的任何子進程。

  pid>0 等待任何子進程識別碼為pid的子進程。

  參數option可以為0 或下面的OR 組合

  WNOHANG 如果沒有任何已經結束的子進程則馬上返回,不予以等待。

  WUNTRACED 如果子進程進入暫停執行情況則馬上返回,但結束狀態不予以理會。

  子進程的結束狀態返回后存於status,底下有幾個宏可判別結束情況

  WIFEXITED(status)如果子進程正常結束則為非0值。

  WEXITSTATUS(status)取得子進程exit()返回的結束代碼,一般會先用WIFEXITED 來判斷是否正常結束才能使用此宏。

  WIFSIGNALED(status)如果子進程是因為信號而結束則此宏值為真

  WTERMSIG(status)取得子進程因信號而中止的信號代碼,一般會先用WIFSIGNALED 來判斷後才使用此宏。

  WIFSTOPPED(status)如果子進程處於暫停執行情況則此宏值為真。一般只有使用WUNTRACED 時才會有此情況。

  WSTOPSIG(status)取得引發子進程暫停的信號代碼,一般會先用WIFSTOPPED 來判斷後才使用此宏。

  返回值  如果執行成功則返回子進程識別碼(PID),如果有錯誤發生則返回-1。失敗原因存於errno中。

  範例  參考wait()。

  

 

       fprintf(格式化輸出數據至文件)

  相關函數  printf,fscanf,vfprintf

  表頭文件  #include<stdio.h>

  定義函數  int fprintf(FILE * stream, const char * format,.......);

  函數說明  fprintf()會根據參數format字元串來轉換並格式化數據,然後將結果輸出到參數stream指定的文件中,直到出現字元串結束('\0')為止。

返回值  關於參數format字元串的格式請參考printf()。成功則返回實際輸出的字元數,失敗則返回-1,錯誤原因存於errno中。

  範例  #include<stdio.h>

  main()

  {

  int i = 150;

  int j = -100;

  double k = 3.14159;

  fprintf(stdout,”%d %f %x \n”,j,k,i);

  fprintf(stdout,”%2d %*d\n”,i,2,i);

  }

  執行  -100 3.141590 96

  150 150

     fscanf(格式化字元串輸入)

  相關函數  scanf,sscanf

  表頭文件  #include<stdio.h>

  定義函數  int fscanf(FILE * stream ,const char *format,....);

  函數說明  fscanf()會自參數stream的文件流中讀取字元串,再根據參數format字元串來轉換並格式化數據。格式轉換形式請參考scanf()。轉換后的結構存於對應的參數內。

  返回值  成功則返回參數數目,失敗則返回-1,錯誤原因存於errno中。

  附加說明

  範例  #include<stdio.h>

  main()

  {

  int i;

  unsigned int j;

  char s[5];

  fscanf(stdin,”%d %x %5[a-z] %*s %f”,&i,&j,s,s);

  printf(“%d %d %s \n”,i,j,s);

  }

  執行  10 0x1b aaaaaaaaa bbbbbbbbbb /*從鍵盤輸入*/

  10 27 aaaaa

  

 

       printf(格式化輸出數據)

  相關函數  scanf,snprintf

  表頭文件  #include<stdio.h>

  定義函數  int printf(const char * format,.............);

  函數說明  printf()會根據參數format字元串來轉換並格式化數據,然後將結果寫出到標準輸出設備,直到出現字元串結束('\0')為止。參數format字元串可包含下列三種字元類型

  1.一般文本,伴隨直接輸出。

  2.ASCII控制字元,如\t、\n等。

  3.格式轉換字元。

  格式轉換為一個百分比符號(%)及其後的格式字元所組成。一般而言,每個%符號在其後都必需有一printf()的參數與之相呼應(只有當%%轉換字元出現時會直接輸出%字元),而欲輸出的數據類型必須與其相對應的轉換字元類型相同。

  Printf()格式轉換的一般形式如下

  %(flags)(width)(.prec)type

  以中括弧括起來的參數為選擇性參數,而%與type則是必要的。底下先介紹type的幾種形式

  整數

  %d 整數的參數會被轉成一有符號的十進位數字

  %u 整數的參數會被轉成一無符號的十進位數字

  %o 整數的參數會被轉成一無符號的八進位數字

  %x 整數的參數會被轉成一無符號的十六進位數字,並以小寫abcdef表示

  %X 整數的參數會被轉成一無符號的十六進位數字,並以大寫ABCDEF表示浮點型數

  %f double 型的參數會被轉成十進位數字,並取到小數點以下六位,四捨五入。

  %e double型的參數以指數形式列印,有一個數字會在小數點前,六位數字在小數點后,而在指數部分會以小寫的e來表示。

  %E 與%e作用相同,唯一區別是指數部分將以大寫的E 來表示。

  %g double 型的參數會自動選擇以%f 或%e 的格式來列印,其標準是根據欲列印的數值及所設置的有效位數來決定。

  %G 與%g 作用相同,唯一區別在以指數形態列印時會選擇%E 格式。

  字元及字元串

  %c 整型數的參數會被轉成unsigned char型列印出。

  %s 指向字元串的參數會被逐字輸出,直到出現NULL字元為止

  %p 如果是參數是“void *”型指針則使用十六進位格式顯示。

  prec 有幾種情況

  1. 正整數的最小位數。

  2.在浮點型數中代表小數位數

  3.在%g 格式代表有效位數的最大值。

  4.在%s格式代表字元串的最大長度。

  5.若為×符號則代表下個參數值為最大長度。

  width為參數的最小長度,若此欄並非數值,而是*符號,則表示以下一個參數當做參數長度。

  flags 有下列幾種情況

  #NAME?

  + 一般在列印負數時,printf()會加印一個負號,整數則不加任何負號。此旗標會使得在列印正數前多一個正號(+)。

  # 此旗標會根據其後轉換字元的不同而有不同含義。當在類型為o 之前(如%#o),則會在列印八進位數值前多印一個o。

  而在類型為x 之前(%#x)則會在列印十六進位數前多印’0x’,在型態為e、E、f、g或G 之前則會強迫數值列印小數點。在類型為g 或G之前時則同時保留小數點及小數位數末尾的零。

  0 當有指定參數時,無數字的參數將補上0。默認是關閉此旗標,所以一般會列印出空白字元。

  返回值  成功則返回實際輸出的字元數,失敗則返回-1,錯誤原因存於errno中。

  範例  #include<stdio.h>

  main()

  {

  int i = 150;

  int j = -100;

  double k = 3.14159;

  printf(“%d %f %x\n”,j,k,i);

  printf(“%2d %*d\n”,i,2,i); /*參數2 會代入格式*中,而與%2d同意義*/

  }

  執行  -100 3.14159 96

  150 150

  

 

       sacnf(格式化字元串輸入)

  相關函數  fscanf,snprintf

  表頭文件  #include<stdio.h>

  定義函數  int scanf(const char * format,.......);

  函數說明  scanf()會將輸入的數據根據參數format字元串來轉換並格式化數據。Scanf()格式轉換的一般形式如下

  %[*][size][l][h]type

  以中括弧括起來的參數為選擇性參數,而%與type則是必要的。

  * 代表該對應的參數數據忽略不保存。

  size 為允許參數輸入的數據長度。

  l 輸入的數據數值以long int 或double型保存。

  h 輸入的數據數值以short int 型保存。

  底下介紹type的幾種形式

  %d 輸入的數據會被轉成一有符號的十進位數字(int)。

  %i 輸入的數據會被轉成一有符號的十進位數字,若輸入數據以“0x”或“0X”開頭代錶轉換十六進位數字,若以“0”開頭則轉換八進位數字,其他情況代表十進位。

  %0 輸入的數據會被轉換成一無符號的八進位數字。

  %u 輸入的數據會被轉換成一無符號的正整數。

  %x 輸入的數據為無符號的十六進位數字,轉換后存於unsigned int型變數。

  %X 同%x

  %f 輸入的數據為有符號的浮點型數,轉換后存於float型變數。

  %e 同%f

  %E 同%f

  %g 同%f

  %s 輸入數據為以空格字元為終止的字元串。

  %c 輸入數據為單一字元。

  [] 讀取數據但只允許括弧內的字元。如[a-z]。

  [^] 讀取數據但不允許中括弧的^符號后的字元出現,如[^0-9].

  返回值  成功則返回參數數目,失敗則返回-1,錯誤原因存於errno中。

  範例  #include <stdio.h>

  main()

  {

  int i;

  unsigned int j;

  char s[5];

  scanf(“%d %x %5[a-z] %*s %f”,&i,&j,s,s);

  printf(“%d %d %s\n”,i,j,s);

  }

  執行  10 0x1b aaaaaaaaaa bbbbbbbbbb

  10 27 aaaaa

  

 

        sprintf(格式化字元串複製)

  相關函數  printf,sprintf

  表頭文件  #include<stdio.h>

  定義函數  int sprintf( char *str,const char * format,.........);

  函數說明  sprintf()會根據參數format字元串來轉換並格式化數據,然後將結果複製到參數str所指的字元串數組,直到出現字元串結束(’\0’)為止。關於參數format字元串的格式請參考printf()。

  返回值  成功則返回參數str字元串長度,失敗則返回-1,錯誤原因存於errno中。

  附加說明  使用此函數得留意堆棧溢出,或改用snprintf()。

  範例  #include<stdio.h>

  main()

  {

  char * a=”This is string A!”;

  char buf[80];

  sprintf(buf,”>>> %s<<<\n”,a);

  printf(“%s”.buf);

  }

  執行  >>>This is string A!<<<

       sscanf(格式化字元串輸入)

  相關函數  scanf,fscanf

  表頭文件  #include<stdio.h>

  定義函數  int sscanf (const char *str,const char * format,........);

  函數說明  sscanf()會將參數str的字元串根據參數format字元串來轉換並格式化數據。格式轉換形式請參考scanf()。轉換后的結果存於對應的參數內。

  返回值  成功則返回參數數目,失敗則返回-1,錯誤原因存於errno中。

  範例  #include<stdio.h>

  main()

  {

  int i;

  unsigned int j;

  char input[ ]=”10 0x1b aaaaaaaa bbbbbbbb”;

  char s[5];

  sscanf(input,”%d %x %5[a-z] %*s %f”,&i,&j,s,s);

  printf(“%d %d %s\n”,i,j,s);

  }

  執行  10 27 aaaaa

  

 

        vfprintf(格式化輸出數據至文件)

  相關函數  printf,fscanf,fprintf

  表頭文件  #include<stdio.h>

  #include<stdarg.h>

  定義函數  int vfprintf(FILE *stream,const char * format,va_list ap);

  函數說明  vfprintf()會根據參數format字元串來轉換並格式化數據,然後將結果輸出到參數stream指定的文件中,直到出現字元串結束(’\0’)為止。關於參數format字元串的格式請參考printf()。va_list用法請參考附錄C或vprintf()範例。

  返回值  成功則返回實際輸出的字元數,失敗則返回-1,錯誤原因存於errno中。

  範例  參考fprintf()及vprintf()。

  

 

        vfscanf(格式化字元串輸入)

  相關函數  scanf,sscanf,fscanf

  表頭文件  #include<stdio.h>

  定義函數  int vfscanf(FILE * stream,const char * format ,va_list ap);

  函數說明  vfscanf()會自參數stream 的文件流中讀取字元串,再根據參數format字元串來轉換並格式化數據。格式轉換形式請參考scanf()。轉換后的結果存於對應的參數內。va_list用法請參考附錄C 或vprintf()。

  返回值  成功則返回參數數目,失敗則返回-1,錯誤原因存於errno中。

  範例  參考fscanf()及vprintf()。

  

 

       vprintf(格式化輸出數據)

  相關函數  printf,vfprintf,vsprintf

  表頭文件  #include<stdio.h>

  #include<stdarg.h>

  定義函數  int vprintf(const char * format,va_list ap);

  函數說明  vprintf()作用和printf()相同,參數format格式也相同。va_list為不定個數的參數列,用法及範例請參考附錄C。

  返回值  成功則返回實際輸出的字元數,失敗則返回-1,錯誤原因存於errno中。

  範例  #include<stdio.h>

  #include<stdarg.h>

  int my_printf( const char *format,……)

  {

  va_list ap;

  int retval;

  va_start(ap,format);

  printf(“my_printf( ):”);

  retval = vprintf(format,ap);

  va_end(ap);

  return retval;

  }

  main()

  {

  int i = 150,j = -100;

  double k = 3.14159;

  my_printf(“%d %f %x\n”,j,k,i);

  my_printf(“%2d %*d\n”,i,2,i);

  }

  執行  my_printf() : -100 3.14159 96

  my_printf() : 150 150

  

      

      vscanf(格式化字元串輸入)

  相關函數  vsscanf,vfscanf

  表頭文件  #include<stdio.h>

  #include<stdarg.h>

  定義函數  int vscanf( const char * format,va_list ap);

  函數說明  vscanf()會將輸入的數據根據參數format字元串來轉換並格式化數據。格式轉換形式請參考scanf()。轉換后的結果存於對應的參數內。va_list用法請參考附錄C或vprintf()範例。

  返回值  成功則返回參數數目,失敗則返回-1,錯誤原因存於errno中。

  範例  請參考scanf()及vprintf()。

 

 

      vsprintf(格式化字元串複製)

  相關函數  vnsprintf,vprintf,snprintf

  表頭文件  #include<stdio.h>

  定義函數  int vsprintf( char * str,const char * format,va_list ap);

  函數說明  vsprintf()會根據參數format字元串來轉換並格式化數據,然後將結果複製到參數str所指的字元串數組,直到出現字元串結束(’\0’)為止。關於參數format字元串的格式請參考printf()。va_list用法請參考附錄C或vprintf()範例。

  返回值  成功則返回參數str字元串長度,失敗則返回-1,錯誤原因存於errno中。

  範例  請參考vprintf()及vsprintf()。

  

 

      vsscanf(格式化字元串輸入)

  相關函數  vscanf,vfscanf

  表頭文件  #include<stdio.h>

  定義函數  int vsscanf(const char * str,const char * format,va_list ap);

  函數說明  vsscanf()會將參數str的字元串根據參數format字元串來轉換並格式化數據。格式轉換形式請參考附錄C 或vprintf()範例。

  返回值  成功則返回參數數目,失敗則返回-1,錯誤原因存於errno中。

  範例  請參考sscanf()及vprintf()。



[火星人 ] linux常用c函數 進程操作篇已經有815次圍觀

http://coctec.com/docs/program/show-post-71596.html