linux 關閉popen 開啟的命令

2021-07-16 05:51:22 字數 1390 閱讀 8056

程式設計了乙個圖形介面用於開了乙個執行緒執行終端命令,通過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...