linuxcsystem
① 在虛擬機的linux下安裝SYSTEM C無法configure
謝謝你的回答!我用的虛擬機是VMWARE WORKSTATION 6.0其他也有人用這個虛擬機,我裝了紅旗linux後安裝SYSTEM C 每次運行到#../configure就報上面的錯誤,於是我又在虛擬機上裝了RED HAT 9.0,在RED HAT 9.0里安裝SYSTEM C 每次運行到#../configure還是報上面的錯誤。為了排除虛擬機的問題,我換了個虛擬機的漢化版裝,還是一樣報錯。真是搞不懂了。
② 如何在linux下使用systemc
1、./configure ;2、make ;3、 make install;SystemC也不例外。將下載的源碼解壓到文件夾如:/home/user/DirA;user代表你的用戶名,DirA表示你創建的某個目錄;
1 cd /home/user/DirA
2
3 ./configure -prefix=INSTALL_DIR //用-prefix=指定要安裝到的目錄路徑,此路徑必須已經存在;
4
5 make
6
7 make install
基本就可以了,我是在虛擬機下的小紅帽,我的安裝遇到一些小的錯誤,主要是example沒有安裝進去,docs也沒有,但類庫都已經安裝好了;
執行 make check 檢查安裝是否成功,make check 成功就沒問題了,我的是成功狀態。
最後的安裝目錄如下:
2、VC6++/VS2010 SystemC使用
前面說過,SystemC實際上是一個C++類庫,因此,VC或者VS下使用SystemC就是外部庫的使用。
庫編譯:下載解壓後的systemc-version下有msvc60等目錄,下面有工程文件,直接可以打開編譯即可得到SystemC的庫。
新建工程;
庫添加:
1)項目右鍵-屬性-配置屬性-連接器-常規:添加附件庫目錄
2)項目右鍵-屬性-配置屬性-連接器-輸入:添加庫
3)項目右鍵-屬性-配置屬性-C/C++-常規:添加頭文件所在目錄
編寫sc_hello.cpp代碼如下並添加到工程:
1 // sc_helloworld.cpp : 定義控制台應用程序的入口點。
2 //
3
4 #include "systemc.h"
5 SC_MODULE(hello)
6 {
7 sc_in<bool> clock;
8 void run()
9 {
10 cout << "@"<<sc_simulation_time<<" hello world" <<endl;
11 }
12
13 SC_CTOR(hello)
14 {
15 SC_METHOD(run);
16 sensitive<<clock.pos();
17 }
18 };
19
20 int sc_main(int argc, char* argv[])
21 {
22 sc_clock clk("clock",20,SC_NS);
23 hello h("hello");
24 h.clock(clk);
25 sc_start(200,SC_NS);
26 system("pause");
27 return 0;
28 }
③ 如何在linux下的C里調用系統命令,等同輸入命令
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
④ Linux c語言用system()調用,帶參數
linux c system函數介紹:
system(執行shell 命令)
相關函數
fork,execve,waitpid,popen
表頭文件
#i nclude
定義函數
int system(const char * string);
函數說明
system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字元串所代表的命令,此命>令執行完後隨即返回原調用的進程。在調用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。
返回值
=-1:出現錯誤
=0:調用成功但是沒有出現子進程
>0:成功退出的子進程的id
如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string為空指針(NULL),則返回非零值>。如果system()調用成功則最後會返回執行shell命令後的返回值,但是此返回值也有可能為 system()調用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。
附加說明
在編寫具有SUID/SGID許可權的程序時請勿使用system(),system()會繼承環境變數,通過環境變數可能會造成系統安全的問題。
範例
#i nclude
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/shado
例2:
char tmp[];
sprintf(tmp,"/bin/mount -t vfat %s /mnt/usb",dev);
system(tmp);
其中dev是/dev/sda1。
system函數的源碼
#include <syspes.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
int system(const char * cmdstring)
{
pid_t pid;
int status;
if(cmdstring == NULL){
return (1);
}
if((pid = fork())<0){
status = -1;
}
else if(pid = 0){
execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
-exit(127); //子進程正常執行則不會執行此語句
}
else
{
while(waitpid(pid, &status, 0) < 0){
if(errno != EINTER)
{
status = -1;
break;
}
}
}
return status;
}
那麼如何獲得system的返回值呢??
char buf[10];
char * ps="ps -ef|grep -c root";
FILE *ptr;
int i;
if((ptr = popen(ps, "r")) != NULL)
{
fgets(buf, 10 , ptr);
i = atoi(buf);
pclose(ptr);
}
可以man下waitpid查看下如何檢查status的值
int ret = system("ls -al /etc/passwd /etc/shadow");
if(WIFSIGNALED(ret))
具體的這些宏查看man waitpid
⑤ Linux下的c編程:系統調用
標準的c函數庫是所有的編譯都要具有的函數庫,(實際上還是略有不同),但是這些基本上實現方法略有不同,但是結果和標準是一樣的。但是linux的系統調用,調用是linux的系統庫,比如說unistd.h下的fork這個是Linux下特有,你在vs上,就沒有這個庫,也沒有這個函數。同樣在vs上寫c,你可以引入頭文件比如windows.h,顯然這個庫是Linux不具有的。簡單說系統調用庫根據具體的操作系統環境不同而不同,而c標准庫,是所有支持c語言編譯器都有的。
⑥ linuxC中,一個主函數裡面,用system(」clear「)清屏,是不是只能清一次
執行一次清一次啦
⑦ Linux下gcc編譯器C語言中用system("colour 03");和printf("\a");為什麼顏色不變,也沒有鳴叫!謝謝
Linux的沒有讓終端變色的Shell指令。只有Windows命令提示符(cmd)才有color這個命令。
printf ("\a" )確實在Linux下沒有鳴叫。
⑧ Linux命令SYSTEM()啟動命令
system是一個使用簡單,設計復雜的程序。
它主要包含fork exec waitpid三個步驟。
下來我來還原樓主的錯誤:
程序A:
/* socksrv.c*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> /* for struct sockaddr_in*/
#define BACKLOG 10
#define MYPORT 4000
int main()
{
char *addr;
int sockfd;
int new_fd;
struct sockaddr_in my_addr, their_addr;
int res;
int sin_size;
char *buf;
/* 取得套接字描述符*/
sockfd = socket(AF_INET, /* domain*/
SOCK_STREAM, /* type*/
0); /* protocol*/
if (sockfd == -1) {
perror("socket");
exit(1);
}
/* Init sockaddr_in */
my_addr.sin_family = AF_INET; /* 注意: 應使用主機位元組順序*/
my_addr.sin_port = htons(MYPORT); /* 注意: 應使用網路位元組順序*/
my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* 使用自己的 IP 地址 */
bzero(&(my_addr.sin_zero), 8); /* 結構的其餘的部分須置 0*/
/* 指定一個套接字使用的地址及埠*/
res = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));
if (res == -1) {
perror("bind");
exit(1);
}
/* 監聽請求, 等待連接*/
res = listen(sockfd,
BACKLOG); /* 未經處理的連接請求隊列可容納的最大數目*/
if (res == -1) {
perror("listen");
exit(1);
}
system("./hello&");
/* 接受對方的連接請求, 建立連接,返回一個新的連接描述符.
* 而第一個套接字描述符仍在你的機器上原來的埠 listen()
*/
sin_size = sizeof(struct sockaddr_in);
new_fd = accept(sockfd, (void *)&their_addr, &sin_size);
buf = (char *)malloc(255);
if (buf == NULL) {
printf("malloc failed\n");
exit(1);
}
/* 接受對方發來的數據*/
res = recv(new_fd, buf, 255, 0);
if (res == -1) {
perror("recv()");
exit(1);
}
/* 關閉本次連接*/
close(new_fd);
/* 關閉系統監聽*/
close(sockfd);
printf("recv data:%s\n", buf);
free(buf);
return 0;
}
程序B:hello,在主程序中用system("./hello&)調用。
#include <stdlib.h>
int main(){
while(1){
sleep(1000);
}
return 0;
}
編譯後運行程序A。我們可以在其它終端窗口看到 ./A ./hello正在運行,netstat -a 看到,tcp 4000埠被 佔用。
我們用Ctrl+c中斷程序A模擬樓主的崩潰操作。
這時,再在其它終端窗口看看,./A沒有了。./hello還在運行。netstat -a看到。4000埠還在佔用。
這時再次運行./A,提示bind: Address already in use而退出。
情況就是這樣。
因為執行system時,系統會fork一個A的子進程,再去執行B.
當你的A崩潰以後,它的一個子進程實際上還在運行,它打開的埠,文件,等還在使用。
所以再次運行A時,由於自定的互斥機制而退出。
如:再次綁定埠時提示埠已在使用。
殺死B後,A的子進程結束,它的資源釋放,所以才能再次運行A。
我建議樓主使用exec系列函數來啟動B。
⑨ linux 下如何編寫c程序,獲得命令行結果
void executeShell(const char *shell){
FILE *stream;
char buf[1024];
memset( buf, '