* UC
+ 文件系統
- 目錄操作
- 文件操作
+ 多進程
- 進程間關系
- 進程間通信
+ 網絡通信
- 基礎知識
- 實踐(tcp/udp)
QT,KDE: Linux環境下的圖形環境編程
=================================================================
* 環境變量:
+ 如何在程序中取得環境變量的內容?
//取得所有的環境變量 -
#include <iostream>
using namespace std;
int main(int argc, char* argv[], char* env[])
{
for( int i=0; env[i]; i++ ){
if(i<9) cout << 0;
cout<< i+1 <<": " << env[i] << endl;
if(i%8==7) cin.get();
}
cout << endl;
}
在進程中設置的環境變量只在本進程與子進程裡使用
因此我們幾乎不在程序裡修改環境變量.
//得到確定的環境變量
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
char* name = "HOME";
char* value = NULL;
value = getenv(name);
cout << "value=" << value << endl;
}
//設置環境變量
#include <iostream>
using namespace std;
#include <cstdlib>
int main()
{
char* var = "baby=beauty";
char* name="baby";
putenv(var);
char* value = getenv(name);
cout << "value=" << value << endl;
}
* 編程習慣:
1, 向函數傳遞指針數組的時候,如果沒有說明元素個數,總是用一個NULL放在末尾.以
NULL作為結束標志.
2, 返回指針的函數,正常返回一個非空指針,出錯返回NULL.
3, 返回整數函數,正常返回一個非負整數(通常是0),出錯返回負數(通常是-1)
perror("提示");//顯示內容為: 提示:錯誤信息文字描述
-----------------------------------------------------------
* 用戶信息:
設置-用戶權限:chmod u+s a.out//把用戶ID符加到文件上
//指權限沾符到這個文件上,讓使用這個文件的用戶都有擁有者一樣的權限
XXX_t 表示是一個整數
struct passwd* getpwuid (int userid)//得到一個指向passwd結構的指針,該結構
包括用戶相關信息記錄.
#include <iostream>
using namespace std;
#include <pwd.h>
int main()
{
passwd* p = NULL;
string name;
int uid;
cout << "input username or id:";
char ch;
ch = cin.peek();
if(ch>=0&&ch<=9){
cin >> uid;
p = getpwuid(uid);
}
else{
cin >> name;
p = getpwnam(name.c_str());
}
if(p==NULL){
cout << "error!" << endl;
}
else{
cout << p->pw_name << endl;
cout << p->pw_uid << endl;
cout << p->pw_gid << endl;
cout << p->pw_dir << endl;
cout << p->pw_shell << endl;
}
}
---------------------------------------------------------
* 文件系統:
+ 目錄
pwd:print working directory
/char* getcwd(char* buf,size_t size);//取得當前工作目錄,出錯返回NULL
// buf是放目錄名字符串的地方,一般是一個字符數組名.
// size 為了避免越界,會把字符串長度也傳過去
// 凡是要自已准備字符數組來保存字符串的時候,也要把長度傳過去.
// 數組越界訪問會導致破壞其它數據或程序崩潰.
// 根據返回值判斷是否出錯
// 函數裡有一條語句: return buf;
// 因此可以直接 cout << getcwd(buf,256);
// getcwd.cc
#include <iostream>
using namespace std;
#include <unistd.h>
int main()
{
char buf[256] = "(unknow)";// 一定要用char數組
cout << getcwd(buf,256) << endl;ssss
cout << buf << endl;
}
DIR* opendir(const char* dirname)//打開目錄
/不能定義一個DIR對象,通常也不會定義DIR*類型變量
struct dirent* readdir(DIR* dirp)//讀取目錄
int closedir(DIR* dirp)//關閉目錄流
//dir.cc
#include <iostream>
using namespace std;
#include <dirent.h>
#include <sys/types.h>
#include <list>
#include <string>
#include <iterator>
#include <algorithm>
int main(int argc,char* argv[])
{
char* dir = NULL;
if(argc==1)
dir = ".";
else
dir = argv[1];
DIR* p = opendir(dir);//....
if(p==NULL){
cout << "not directory or not exitst" << endl;
return -1;//....
}
list<string> ls;
dirent* pd = NULL;
while( (pd=readdir(p))){
if(pd->d_name[0]==.) continue;
ls.push_back(pd->d_name);
}
closedir(p);//.....
ls.sort();
//copy(ls.begin(),ls.end(),ostream_iterator<string>(cout,"
"));
list<string>::iterator it;
it = ls.begin();
while(it!=ls.end())
cout << *it++ << << endl;
cout << endl;
return 0;//....
} //end of main
int stat(const char* path/*文件名*/,stat* buf)函數;//用來取得一個文件的信
息
//stat.cc
#include <iostream>
using namespace std;
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
int main(int argc, char* argv[])
{
if(argc==1) {
cout << "no filename" << endl;
return 0;
}
int res;
struct stat s;
res = stat(argv[1],&s);
if(res <0){
&nbs