程式設計了乙個圖形介面用於開了乙個執行緒執行終端命令,通過pope開啟乙個管道來執行命令,
此時需要迴圈讀取程式執行的結果。
void* command_exec(void* cmdstr)
while(fgets(buff,200, cmdstream)!=null)
pclose(cmdstream);
pthread_exit(null);
}由於命令一直都在執行,一直在while迴圈中 , 該執行緒不能結束,此時需要結束命令,通過pthread_kill結束執行緒來實現發現命令所起的程序並沒有關閉,而且cmdsream檔案流也沒有正常close, 最後通過訊號處理函式
void command_exit()
}關閉了管道,但是命令程序還是存在著,最後通過修改popen , pclose 函式原始碼自己實現結束程序來完成。
修改後的函式如下,在pclose 中新增了kill
#define shell "/bin/bash"
static pid_t *childpid=null; /*ptr to array allocated at run-time*/
static int maxfd; /*from our open_max(), */
file *popen2(const char *cmdstring, const char *type)
if(childpid == null)
if(pipe(pfd) < 0)
return(null); //errno set by pipe()
if((pid = fork()) < 0)
return(null); //error set by fork()
else if(pid==0)
} else
}/*close all descriptiors in childpid*/
for(i = 0; i < maxfd; i++)
if(childpid[i] > 0)
close(i);
execl(shell, "bash", "-c", cmdstring, (char *)0);
_exit(127);
}/*parent*/
if(*type == 'r') else
childpid[fileno(fp)] = pid; /*remember child pid for this fd*/
return(fp);
}int pclose2(file *fp)
else
while(waitpid(pid, &stat, 0) < 0)
return(stat);
}解決了問題、保持在圖形介面上只執行乙個命令程序並顯示命令結果
Linux下開啟 關閉MySql Server命令
linux下開啟 關閉mysql server命令 開始用net start mysql 啟動mysql,結果發現老報某個檔案不存在,後用下面方式啟動mysql 如果你用的是redhat fedora,那麼就可以用這些命令 開啟 etc init.d mysqld start 關閉 etc init...
linux的popen函式使用
有了popen,使得linux開發的程式相當於可以輕鬆呼叫這台機器上的任何程式,因為popen執行命令後,可以返回執行輸出結果供程式使用 使用範例 include include strlen include include includeusing namespace std execute sh...
Linux防火牆的開啟關閉
1 檢視防火狀態 systemctl status firewalld service iptables status 2 暫時關閉防火牆 systemctl stop firewalld service iptables stop 3 永久關閉防火牆 systemctl disable firew...