基本linux命令有哪些呢?
利辛網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司從2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
1、ls命令
就是 list 的縮寫,通過 ls 命令不僅可以查看 linux 文件夾包含的文件,而且可以查看文件權(quán)限(包括目錄、文件夾、文件權(quán)限)查看目錄信息等等。
常用參數(shù)搭配:
ls -a 列出目錄所有文件,包含以.開始的隱藏文件
ls -A 列出除.及..的其它文件
ls -r 反序排列
ls -t 以文件修改時(shí)間排序
ls -S 以文件大小排序
ls -h 以易讀大小顯示
ls -l 除了文件名之外,還將文件的權(quán)限、所有者、文件大小等信息詳細(xì)列出來
實(shí)例:
(1) 按易讀方式按時(shí)間反序排序,并顯示文件詳細(xì)信息
ls -lhrt
(2) 按大小反序顯示文件詳細(xì)信息
ls -lrS
(3)列出當(dāng)前目錄中所有以"t"開頭的目錄的詳細(xì)內(nèi)容
ls -l t*
(4) 列出文件絕對(duì)路徑(不包含隱藏文件)
ls | sed "s:^:`pwd`/:"
(5) 列出文件絕對(duì)路徑(包含隱藏文件)
find $pwd -maxdepth 1 | xargs ls -ld
2、cd 命令
cd(changeDirectory) 命令語法:
cd [目錄名]
說明:切換當(dāng)前目錄至 dirName。
實(shí)例:
(1)進(jìn)入要目錄
cd /
(2)進(jìn)入 "home" 目錄
cd ~
(3)進(jìn)入上一次工作路徑
cd -
(4)把上個(gè)命令的參數(shù)作為cd參數(shù)使用。
cd !$
3、pwd 命令
pwd 命令用于查看當(dāng)前工作目錄路徑。
實(shí)例:
(1)查看當(dāng)前路徑
pwd
(2)查看軟鏈接的實(shí)際路徑
pwd -P
4、mkdir 命令
mkdir 命令用于創(chuàng)建文件夾。
可用選項(xiàng):
-m: 對(duì)新建目錄設(shè)置存取權(quán)限,也可以用 chmod 命令設(shè)置;
-p: 可以是一個(gè)路徑名稱。此時(shí)若路徑中的某些目錄尚不存在,加上此選項(xiàng)后,系統(tǒng)將自動(dòng)建立好那些尚不在的目錄,即一次可以建立多個(gè)目錄。
實(shí)例:
(1)當(dāng)前工作目錄下創(chuàng)建名為 t的文件夾
mkdir t
(2)在 tmp 目錄下創(chuàng)建路徑為 test/t1/t 的目錄,若不存在,則創(chuàng)建:
mkdir -p /tmp/test/t1/t
5、rm 命令
刪除一個(gè)目錄中的一個(gè)或多個(gè)文件或目錄,如果沒有使用 -r 選項(xiàng),則 rm 不會(huì)刪除目錄。如果使用 rm 來刪除文件,通常仍可以將該文件恢復(fù)原狀。
rm [選項(xiàng)] 文件…
實(shí)例:
(1)刪除任何 .log 文件,刪除前逐一詢問確認(rèn):
rm -i *.log
(2)刪除 test 子目錄及子目錄中所有檔案刪除,并且不用一一確認(rèn):
rm -rf test
(3)刪除以 -f 開頭的文件
rm -- -f*
6、rmdir 命令
從一個(gè)目錄中刪除一個(gè)或多個(gè)子目錄項(xiàng),刪除某目錄時(shí)也必須具有對(duì)其父目錄的寫權(quán)限。
注意:不能刪除非空目錄
實(shí)例:
(1)當(dāng) parent 子目錄被刪除后使它也成為空目錄的話,則順便一并刪除:
rmdir -p parent/child/child11
7、mv 命令
移動(dòng)文件或修改文件名,根據(jù)第二參數(shù)類型(如目錄,則移動(dòng)文件;如為文件則重命令該文件)。
當(dāng)?shù)诙€(gè)參數(shù)為目錄時(shí),第一個(gè)參數(shù)可以是多個(gè)以空格分隔的文件或目錄,然后移動(dòng)第一個(gè)參數(shù)指定的多個(gè)文件到第二個(gè)參數(shù)指定的目錄中。
實(shí)例:
(1)將文件 test.log 重命名為 test1.txt
mv test.log test1.txt
(2)將文件 log1.txt,log2.txt,log3.txt 移動(dòng)到根的 test3 目錄中
mv llog1.txt log2.txt log3.txt /test3
(3)將文件 file1 改名為 file2,如果 file2 已經(jīng)存在,則詢問是否覆蓋
mv -i log1.txt log2.txt
(4)移動(dòng)當(dāng)前文件夾下的所有文件到上一級(jí)目錄
mv * ../
8、cp 命令
將源文件復(fù)制至目標(biāo)文件,或?qū)⒍鄠€(gè)源文件復(fù)制至目標(biāo)目錄。
注意:命令行復(fù)制,如果目標(biāo)文件已經(jīng)存在會(huì)提示是否覆蓋,而在 shell 腳本中,如果不加 -i 參數(shù),則不會(huì)提示,而是直接覆蓋!
-i 提示
-r 復(fù)制目錄及目錄內(nèi)所有項(xiàng)目
-a 復(fù)制的文件與原文件時(shí)間一樣
實(shí)例:
(1)復(fù)制 a.txt 到 test 目錄下,保持原文件時(shí)間,如果原文件存在提示是否覆蓋。
cp -ai a.txt test
(2)為 a.txt 建議一個(gè)鏈接(快捷方式)
cp -s a.txt link_a.txt
9、cat 命令
cat 主要有三大功能:
1.一次顯示整個(gè)文件:
cat filename
2.從鍵盤創(chuàng)建一個(gè)文件:
cat filename
只能創(chuàng)建新文件,不能編輯已有文件。
3.將幾個(gè)文件合并為一個(gè)文件:
cat file1 file2 file
-b 對(duì)非空輸出行號(hào)
-n 輸出所有行號(hào)
實(shí)例:
(1)把 log2012.log 的文件內(nèi)容加上行號(hào)后輸入 log2013.log 這個(gè)文件里
cat -n log2012.log log2013.log
(2)把 log2012.log 和 log2013.log 的文件內(nèi)容加上行號(hào)(空白行不加)之后將內(nèi)容附加到 log.log 里
cat -b log2012.log log2013.log log.log
(3)使用 here doc 生成新文件
cat log.txt EOF
Hello
World
PWD=$(pwd)
EOF
ls -l log.txt
cat log.txt
Hello
World
PWD=/opt/soft/test
(4)反向列示
tac log.txt
PWD=/opt/soft/test
World
Hello
10、more 命令
功能類似于 cat, more 會(huì)以一頁一頁的顯示方便使用者逐頁閱讀,而最基本的指令就是按空白鍵(space)就往下一頁顯示,按 b 鍵就會(huì)往回(back)一頁顯示。
命令參數(shù):
+n 從笫 n 行開始顯示
-n 定義屏幕大小為n行
+/pattern 在每個(gè)檔案顯示前搜尋該字串(pattern),然后從該字串前兩行之后開始顯示
-c 從頂部清屏,然后顯示
-d 提示“Press space to continue,’q’ to quit(按空格鍵繼續(xù),按q鍵退出)”,禁用響鈴功能
-l 忽略Ctrl+l(換頁)字符
-p 通過清除窗口而不是滾屏來對(duì)文件進(jìn)行換頁,與-c選項(xiàng)相似
-s 把連續(xù)的多個(gè)空行顯示為一行
-u 把文件內(nèi)容中的下畫線去掉
常用操作命令:
Enter 向下 n 行,需要定義。默認(rèn)為 1 行
Ctrl+F 向下滾動(dòng)一屏
空格鍵 向下滾動(dòng)一屏
Ctrl+B 返回上一屏
= 輸出當(dāng)前行的行號(hào)
:f 輸出文件名和當(dāng)前行的行號(hào)
V 調(diào)用vi編輯器
!命令 調(diào)用Shell,并執(zhí)行命令
q 退出more
實(shí)例:
(1)顯示文件中從第3行起的內(nèi)容
more +3 text.txt
(2)在所列出文件目錄詳細(xì)信息,借助管道使每次顯示 5 行
ls -l | more -5
按空格顯示下 5 行。
11、less 命令
less 與 more 類似,但使用 less 可以隨意瀏覽文件,而 more 僅能向前移動(dòng),卻不能向后移動(dòng),而且 less 在查看之前不會(huì)加載整個(gè)文件。
常用命令參數(shù):
-i 忽略搜索時(shí)的大小寫
-N 顯示每行的行號(hào)
-o 文件名 將less 輸出的內(nèi)容在指定文件中保存起來
-s 顯示連續(xù)空行為一行
/字符串:向下搜索“字符串”的功能
?字符串:向上搜索“字符串”的功能
n:重復(fù)前一個(gè)搜索(與 / 或 ? 有關(guān))
N:反向重復(fù)前一個(gè)搜索(與 / 或 ? 有關(guān))
-x 數(shù)字 將“tab”鍵顯示為規(guī)定的數(shù)字空格
b 向后翻一頁
d 向后翻半頁
h 顯示幫助界面
Q 退出less 命令
u 向前滾動(dòng)半頁
y 向前滾動(dòng)一行
空格鍵 滾動(dòng)一行
回車鍵 滾動(dòng)一頁
[pagedown]: 向下翻動(dòng)一頁
[pageup]: 向上翻動(dòng)一頁
實(shí)例:
(1)ps 查看進(jìn)程信息并通過 less 分頁顯示
ps -aux | less -N
(2)查看多個(gè)文件
less 1.log 2.log
可以使用 n 查看下一個(gè),使用 p 查看前一個(gè)。
12、head 命令
head 用來顯示檔案的開頭至標(biāo)準(zhǔn)輸出中,默認(rèn) head 命令打印其相應(yīng)文件的開頭 10 行。
常用參數(shù):
-n行數(shù) 顯示的行數(shù)(行數(shù)為復(fù)數(shù)表示從最后向前數(shù))
實(shí)例:
(1)顯示 1.log 文件中前 20 行
head 1.log -n 20
(2)顯示 1.log 文件前 20 字節(jié)
head -c 20 log2014.log
(3)顯示 t.log最后 10 行
head -n -10 t.log
13、tail 命令
用于顯示指定文件末尾內(nèi)容,不指定文件時(shí),作為輸入信息進(jìn)行處理。常用查看日志文件。
常用參數(shù):
-f 循環(huán)讀?。ǔS糜诓榭催f增的日志文件)
-n行數(shù) 顯示行數(shù)(從后向前)
(1)循環(huán)讀取逐漸增加的文件內(nèi)容
ping 127.0.0.1 ping.log
后臺(tái)運(yùn)行:可使用 jobs -l 查看,也可使用 fg 將其移到前臺(tái)運(yùn)行。
tail -f ping.log
(查看日志)
14、which 命令
在 linux 要查找某個(gè)文件,但不知道放在哪里了,可以使用下面的一些命令來搜索:
which 查看可執(zhí)行文件的位置。
whereis 查看文件的位置。
locate 配合數(shù)據(jù)庫查看文件位置。
find 實(shí)際搜尋硬盤查詢文件名稱。
which 是在 PATH 就是指定的路徑中,搜索某個(gè)系統(tǒng)命令的位置,并返回第一個(gè)搜索結(jié)果。使用 which 命令,就可以看到某個(gè)系統(tǒng)命令是否存在,以及執(zhí)行的到底是哪一個(gè)位置的命令。
常用參數(shù):
-n 指定文件名長(zhǎng)度,指定的長(zhǎng)度必須大于或等于所有文件中最長(zhǎng)的文件名。
實(shí)例:
(1)查看 ls 命令是否存在,執(zhí)行哪個(gè)
which ls
(2)查看 which
which which
(3)查看 cd
which cd(顯示不存在,因?yàn)?cd 是內(nèi)建命令,而 which 查找顯示是 PATH 中的命令)
查看當(dāng)前 PATH 配置:
echo $PATH
或使用 env 查看所有環(huán)境變量及對(duì)應(yīng)值
15、whereis 命令
whereis 命令只能用于程序名的搜索,而且只搜索二進(jìn)制文件(參數(shù)-b)、man說明文件(參數(shù)-m)和源代碼文件(參數(shù)-s)。如果省略參數(shù),則返回所有信息。whereis 及 locate 都是基于系統(tǒng)內(nèi)建的數(shù)據(jù)庫進(jìn)行搜索,因此效率很高,而find則是遍歷硬盤查找文件。
常用參數(shù):
-b 定位可執(zhí)行文件。
-m 定位幫助文件。
-s 定位源代碼文件。
-u 搜索默認(rèn)路徑下除可執(zhí)行文件、源代碼文件、幫助文件以外的其它文件。
實(shí)例:
(1)查找 locate 程序相關(guān)文件
whereis locate
(2)查找 locate 的源碼文件
whereis -s locate
(3)查找 lcoate 的幫助文件
whereis -m locate
26203就是你這個(gè)程序運(yùn)行時(shí)候的 PID 阿,你在發(fā)消息之前,不是把當(dāng)前進(jìn)程的PID存放到消息里的 mtype 了嗎
p-mtype = getpid();
然后接收方收到這個(gè)消息,又把 mtype 打印出來了阿
printf("Message received from %ld\n%s\n" , p-mtype , p-mdata );
這個(gè)就是打印從 PID 收到了消息,消息是 p-mdata里的內(nèi)容。
Linux采用消息隊(duì)列的方式來實(shí)現(xiàn)消息傳遞。這種消息的發(fā)送方式是:發(fā)送方不必等待接收方檢查它所收到的消息就可以繼續(xù)工作下去,而接收方如果沒有收到消息也不需等待。這種通信機(jī)制相對(duì)簡(jiǎn)單,但是應(yīng)用程序使用起來就需要使用相對(duì)復(fù)雜的方式來應(yīng)付了。新的消息總是放在隊(duì)列的末尾,接收的時(shí)候并不總是從頭來接收,可以從中間來接收。
消息隊(duì)列是隨內(nèi)核持續(xù)的并和進(jìn)程相關(guān),只有在內(nèi)核重起或者顯示刪除一個(gè)消息隊(duì)列時(shí),該消息隊(duì)列才會(huì)真正被刪除。因此系統(tǒng)中記錄消息隊(duì)列的數(shù)據(jù)結(jié)構(gòu) (struct ipc_ids msg_ids)位于內(nèi)核中,系統(tǒng)中的所有消息隊(duì)列都可以在結(jié)構(gòu)msg_ids中中找到訪問入口。
IPC標(biāo)識(shí)符:每一個(gè)I P C目標(biāo)都有一個(gè)唯一的I P C標(biāo)識(shí)符。這里所指的I P C目標(biāo)是指一個(gè)單獨(dú)的消息隊(duì)列、一個(gè)信號(hào)量集或者一個(gè)共享的內(nèi)存段。系統(tǒng)內(nèi)核使用此標(biāo)識(shí)符在系統(tǒng)內(nèi)核中指明 I P C目標(biāo)。
消息隊(duì)列本質(zhì)上是位于內(nèi)核空間的鏈表,鏈表的每個(gè)節(jié)點(diǎn)都是一條消息。每一條消息都有自己的消息類型,消息類型用整數(shù)來表示,而且必須大于 0。每種類型的消息都被對(duì)應(yīng)的鏈表所維護(hù):
其中數(shù)字 1 表示類型為 1 的消息,數(shù)字2、3、4 類似。彩色塊表示消息數(shù)據(jù),它們被掛在對(duì)應(yīng)類型的鏈表上。
值得注意的是,剛剛說過沒有消息類型為 0 的消息,實(shí)際上,消息類型為 0 的鏈表記錄了所有消息加入隊(duì)列的順序,其中紅色箭頭表示消息加入的順序。
無論你是發(fā)送還是接收消息,消息的格式都必須按照規(guī)范來。簡(jiǎn)單的說,它一般長(zhǎng)成下面這個(gè)樣子:
所以,只要你保證首4字節(jié)(32 位 linux 下的 long)是一個(gè)整數(shù)就行了。
舉個(gè)例子:
從上面可以看出,正文部分是什么數(shù)據(jù)類型都沒關(guān)系,因?yàn)橄㈥?duì)列傳遞的是 2 進(jìn)制數(shù)據(jù),不一定非得是文本。
msgsnd 函數(shù)用于將數(shù)據(jù)發(fā)送到消息隊(duì)列。如果該函數(shù)被信號(hào)打斷,會(huì)設(shè)置 errno 為 EINTR。
參數(shù) msqid:ipc 內(nèi)核對(duì)象 id
參數(shù) msgp:消息數(shù)據(jù)地址
參數(shù) msgsz:消息正文部分的大?。ú话㈩愋停?/p>
參數(shù) msgflg:可選項(xiàng)
該值為 0:如果消息隊(duì)列空間不夠,msgsnd 會(huì)阻塞。
IPC_NOWAIT:直接返回,如果空間不夠,會(huì)設(shè)置 errno 為 EAGIN.
返回值:0 表示成功,-1 失敗并設(shè)置 errno。
msgrcv 函數(shù)從消息隊(duì)列取出消息后,并將其從消息隊(duì)列里刪除。
參數(shù) msqid:ipc 內(nèi)核對(duì)象 id
參數(shù) msgp:用來接收消息數(shù)據(jù)地址
參數(shù) msgsz:消息正文部分的大小(不包含消息類型)
參數(shù) msgtyp:指定獲取哪種類型的消息
msgtyp = 0:獲取消息隊(duì)列中的第一條消息
msgtyp 0:獲取類型為 msgtyp 的第一條消息,除非指定了 msgflg 為MSG_EXCEPT,這表示獲取除了 msgtyp 類型以外的第一條消息。
msgtyp 0:獲取類型 ≤|msgtyp|≤|msgtyp| 的第一條消息。
參數(shù) msgflg:可選項(xiàng)。
如果為 0 表示沒有消息就阻塞。
IPC_NOWAIT:如果指定類型的消息不存在就立即返回,同時(shí)設(shè)置 errno 為 ENOMSG
MSG_EXCEPT:僅用于 msgtyp 0 的情況。表示獲取類型不為 msgtyp 的消息
MSG_NOERROR:如果消息數(shù)據(jù)正文內(nèi)容大于 msgsz,就將消息數(shù)據(jù)截?cái)酁?msgsz
程序 msg_send 和 msg_recv 分別用于向消息隊(duì)列發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。
msg_send 程序定義了一個(gè)結(jié)構(gòu)體 Msg,消息正文部分是結(jié)構(gòu)體 Person。該程序向消息隊(duì)列發(fā)送了 10 條消息。
msg_send.c
程序 msg_send 第一次運(yùn)行完后,內(nèi)核中的消息隊(duì)列大概像下面這樣:
msg_recv 程序接收一個(gè)參數(shù),表示接收哪種類型的消息。比如./msg_recv 4 表示接收類型為 4 的消息,并打印在屏幕。
先運(yùn)行 msg_send,再運(yùn)行 msg_recv。
接收所有消息
接收類型為 4 的消息
獲取和設(shè)置消息隊(duì)列的屬性
msqid:消息隊(duì)列標(biāo)識(shí)符
cmd:控制指令
IPC_STAT:獲得msgid的消息隊(duì)列頭數(shù)據(jù)到buf中
IPC_SET:設(shè)置消息隊(duì)列的屬性,要設(shè)置的屬性需先存儲(chǔ)在buf中,可設(shè)置的屬性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes
buf:消息隊(duì)列管理結(jié)構(gòu)體。
返回值:
成功:0
出錯(cuò):-1,錯(cuò)誤原因存于error中
EACCESS:參數(shù)cmd為IPC_STAT,確無權(quán)限讀取該消息隊(duì)列
EFAULT:參數(shù)buf指向無效的內(nèi)存地址
EIDRM:標(biāo)識(shí)符為msqid的消息隊(duì)列已被刪除
EINVAL:無效的參數(shù)cmd或msqid
EPERM:參數(shù)cmd為IPC_SET或IPC_RMID,卻無足夠的權(quán)限執(zhí)行
#include
#include
#include
#include types.h
#include msg.h
#include
#include ipc.h
void msg_show_attr(int msg_id, struct msqid_ds msg_info)
{
int ret = -1;
sleep(1);
ret = msgctl(msg_id, IPC_STAT, msg_info);
if( -1 == ret)
{
printf(獲消息信息失敗\n);
return ;
}
printf(\n);
printf(現(xiàn)隊(duì)列字節(jié)數(shù):%d\n,msg_info.msg_cbytes);
printf(隊(duì)列消息數(shù):%d\n,msg_info.msg_qnum);
printf(隊(duì)列字節(jié)數(shù):%d\n,msg_info.msg_qbytes);
printf(發(fā)送消息進(jìn)程pid:%d\n,msg_info.msg_lspid);
printf(接收消息進(jìn)程pid:%d\n,msg_info.msg_lrpid);
printf(發(fā)送消息間:%s,ctime((msg_info.msg_stime)));
printf(接收消息間:%s,ctime((msg_info.msg_rtime)));
printf(變化間:%s,ctime((msg_info.msg_ctime)));
printf(消息UID:%d\n,msg_info.msg_perm.uid);
printf(消息GID:%d\n,msg_info.msg_perm.gid);
}
int main(void)
{
int ret = -1;
int msg_flags, msg_id;
key_t key;
struct msgmbuf{
int mtype;
char mtext[10];
};
struct msqid_ds msg_info;
struct msgmbuf msg_mbuf;
int msg_sflags,msg_rflags;
char *msgpath = /ipc/msg/;
key = ftok(msgpath,’a');
if(key != -1)
{
printf(功建立KEY\n);
}
else
{
printf(建立KEY失敗\n);
}
msg_flags = IPC_CREAT;
msg_id = msgget(key, msg_flags|0666);
if( -1 == msg_id)
{
printf(消息建立失敗\n);
return 0;
}
msg_show_attr(msg_id, msg_info);
msg_sflags = IPC_NOWAIT;
msg_mbuf.mtype = 10;
memcpy(msg_mbuf.mtext,測(cè)試消息,sizeof(測(cè)試消息));
ret = msgsnd(msg_id, msg_mbuf, sizeof(測(cè)試消息), msg_sflags);
if( -1 == ret)
{
printf(發(fā)送消息失敗\n);
}
msg_show_attr(msg_id, msg_info);
msg_rflags = IPC_NOWAIT|MSG_NOERROR;
ret = msgrcv(msg_id, msg_mbuf, 10,10,msg_rfla
共享內(nèi)存示例代碼:
#include
#include sem.h
#include ipc.h
#include
typedef int sem_t;
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
} arg;
sem_t CreateSem(key_t key, int value)
{
union semun sem;
sem_t semid;
sem.val = value;
semid = semget(key,value,IPC_CREAT|0666);
if (-1 == semid)
{
printf(create semaphore error\n);
return -1;
}
semctl(semid,0,SETVAL,sem);
return semid;
}
/*
struct sembuf{
ushort sem_num;
short sem_op;
short sem_flg;
};
*/
void SetvalueSem(sem_t semid, int value)
{
union semun sem;
sem.val = value;
semctl(semid,0,SETVAL,sem);
return ;
}
int GetvalueSem(sem_t semid)
{
union semun sem;
return semctl(semid,0,GETVAL,sem);
return sem.val;
}
void DestroySem(sem_t semid)
{
union semun sem;
sem.val = 0;
semctl(semid,0,IPC_RMID,sem);
}
int Sem_P(sem_t semid)
{
struct sembuf sops={0,+1,IPC_NOWAIT};
return (semop(semid,sops,1));
}
int Sem_V(sem_t semid)
{
struct sembuf sops={0,-1,IPC_NOWAIT};
return (semop(semid,sops,1));
}
static char msg[]=共享內(nèi)存\n;
int main(void)
{
key_t key;
int semid,shmid;
char i,*shms,*shmc;
struct semid_ds buf;
int value = 0;
char buffer[80];
pid_t p;
key = ftok(/ipc/sem/,’a');
shmid = shmget(key,1024,IPC_CREAT|0604);
semid = CreateSem(key,1);
p = fork();
if(p 0)
{
/* 父進(jìn)程 */
/* 建立共享內(nèi)存 */
shms = (char *)shmat(shmid,0,0);
memcpy(shms, msg, strlen(msg)+1);
sleep(10);
Sem_P(semid);
shmdt(shms);
DestroySem(semid);
}
else if(p == 0)
{
shmc = (char *)shmat(shmid,0,0);
Sem_V(semid);
printf(共享內(nèi)存值:%s\n,shmc);
shmdt(sg_