Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6
c/c++ popen/pclose || är det en bra eller dålig implemntation?
En hake är att du dödar nuvarande användarens alla vlc-processer. Om du inte behöver stdout och bara vill starta processen och döda den efter viss tid/ett ett specifikt kriterium borde något i stil med detta fungera
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
pid_t child_pid = fork();
if (child_pid == 0) {
while (1) {
printf("child process\n");
sleep(1);
}
} else {
printf("time to sleep, main process\n");
sleep(5);
printf("die, child process!\n");
kill(child_pid, SIGKILL);
}
}
...om du byter ut den meningslösa child-loopen mot någon lämplig variant av exec och ändrar SIGKILL till SIGTERM.
Senare hade jag i tanke att eventuellt göra något med stdout, men till en början vill jag bara får den att hantera olika program genom att slå på och döda dem.
Hur som helst har jag testa en liknade de du föreslår ovan (koden nedan är tagen från stackoverflow):
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <sys/wait.h>
#include <errno.h>
#include <string>
#include <sstream>
using namespace std;
#define READ 0
#define WRITE 1
FILE * popen2(string command, string type, int & pid)
{
pid_t child_pid;
int fd[2];
pipe(fd);
if((child_pid = fork()) == -1)
{
perror("fork");
exit(1);
}
/* child process */
if (child_pid == 0)
{
if (type == "r")
{
close(fd[READ]); //Close the READ end of the pipe since the child's fd is write-only
dup2(fd[WRITE], 1); //Redirect stdout to pipe
}
else
{
close(fd[WRITE]); //Close the WRITE end of the pipe since the child's fd is read-only
dup2(fd[READ], 0); //Redirect stdin to pipe
}
setpgid(child_pid, child_pid); //Needed so negative PIDs can kill children of /bin/sh
execl("/bin/sh", "/bin/sh", "-c", command.c_str(), NULL);
exit(0);
}
else
{
if (type == "r")
{
close(fd[WRITE]); //Close the WRITE end of the pipe since parent's fd is read-only
}
else
{
close(fd[READ]); //Close the READ end of the pipe since parent's fd is write-only
}
}
pid = child_pid;
if (type == "r")
{
return fdopen(fd[READ], "r");
}
return fdopen(fd[WRITE], "w");
}
int pclose2(FILE * fp, pid_t pid)
{
int stat;
fclose(fp);
while (waitpid(pid, &stat, 0) == -1)
{
if (errno != EINTR)
{
stat = -1;
break;
}
}
return stat;
}
int main()
{
int pid;
string command = "ls -l";
FILE * fp = popen2(command, "r", pid);
char command_out[100] = {0};
stringstream output;
//Using read() so that I have the option of using select() if I want non-blocking flow
while (read(fileno(fp), command_out, sizeof(command_out)-1) != 0)
{
output << string(command_out);
// https://linux.die.net/man/2/kill
kill(-pid, 9);
memset(&command_out, 0, sizeof(command_out));
}
string token;
while (getline(output, token, '\n'))
printf("OUT: %s\n", token.c_str());
pclose2(fp, pid);
return 0;
}
Vilket jag använde mig av för att göra vlc test grej med där jag bara skrev om main till:
int main(){
FILE *fd;
Timer timer;
int pid;
fd = popen2("vlc", "r", pid);
if( fd == NULL ){
std::cout << "Shit is going done" << std::endl;
}
while(10000.0 > timer.elapsed()){
std::cout << "Still waiting" << std::endl;
}
// https://linux.die.net/man/2/kill
kill(-pid, 9);
std::cout << "After wait" << std::endl;
pclose2(fd, pid);
}
Problemet är att de nedre koden där jag skrev om main, så dödar den fortfarande inte VLC. Men enligt denna länk är sigkill = 9. Då den koden på stackoverflow använder sig av negativa PID för att döda innebär att den dödar hela process gruppen med -pid, enligt denna länk.
Det var då jag skrev min "ful" kod längst upp. För jag förstår inte varför VLC lever.
P.S här nedan är TIMER koden:
#ifndef _TIMER_H_
#define _TIMER_H_
#include <chrono>
#include <thread>
class Timer {
typedef std::chrono::high_resolution_clock clock;
public:
Timer():start(clock::now()){}
inline void reset() {
start = clock::now();
}
inline void sleep(int n) const{
std::this_thread::sleep_for(std::chrono::milliseconds(n));
}
inline double elapsed() const {
return std::chrono::duration_cast<std::chrono::milliseconds>(clock::now() - start).count();
}
private:
std::chrono::time_point<clock> start;
};
#endif /*_TIMER_H_*/
Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6
- Igår Quiz: Har du koll på det senaste inom processorkylare? 65
- Igår Cooler Master Ncore 100 Max – lättbyggt minstingchassi 12
- 27 / 3 Nytt vetenskapligt genombrott kan lösa OLED-inbränning 45
- 27 / 3 Microsoft vill göra handhållen Xbox 41
- 26 / 3 Microsoft patenterar teknik för bättre ray tracing-prestanda 27
- Igår Ny RAM-sparande funktion upptäckt i Microsoft Edge 7
- Igår Så byter du till gamla Notepad i Windows 11 32
- Igår Microsoft Copilot kan snart köras direkt på datorn 13
- 27 / 3 Stort steg för Windows på ARM: Google släpper optimerat Chrome 26
- 27 / 3 Xbox-chef är öppen för fler spelbutiker på konsol 23
- Igår Svenska Embracer säljer Gearbox för 4,9 miljarder kronor 13
- Igår Var femte användare har lämnat X sedan Musk tog över 110
- 27 / 3 Veckans fråga: Hur gammalt är ditt Steam-konto? 162
- 27 / 3 Bluffkampanj sprider sig genom Googles AI-sökfunktion 11
- 26 / 3 82 studenter avstängda för AI-fusk – Uppsala strängast 55
- Hur mkt kan jag sälja min dator för1
- Kan jag få in ett grafikkort i den här workstation-burken13
- Bredband Fiber 100/100 - Bahnhof höjer pris till 49932
- Köpråd: Bredband via fiber7
- Vilka obskyra elektronikmärken på Amazon.se är bra och pålitliga?59
- Quiz: Har du koll på det senaste inom processorkylare?65
- Kontakt fiberkabel7
- Speldistributörer kan lämna Xbox: "Döende i Europa"103
- Svenska Embracer säljer Gearbox för 4,9 miljarder kronor13
- Skärm till Ps5?4
- Köpes Söker 24-25" 240hz+ 1080p. Ev byte mot 1440p 165hz
- Köpes Desktop/"server"/Workstation, 128gb RAM (t.ex. LGA 2011-system) eller delar till sådant system
- Säljes Playstation 5 - Digital Edition
- Säljes Acer Nitro N50-600 (9400F, 1660 Ti, 32 GB RAM & 500 GB SSD)
- Säljes Utförsäljning: 3 stycken helt nya roomba robotdammsugare säljes till bra pris.
- Säljes Kingston 32GB (2x16GB) DDR5 6000MHz CL36 FURY Beast
- Säljes Gigabyte B650I Aorus Ultra AM5 - garanti
- Säljes apple macbook pro 16 m1 max 32gb ram 1tb ssd
- Säljes Apple iPad Pro 11'' 5G (gen 4)
- Säljes Xbox Series S
- Ny RAM-sparande funktion upptäckt i Microsoft Edge7
- Quiz: Har du koll på det senaste inom processorkylare?65
- Svenska Embracer säljer Gearbox för 4,9 miljarder kronor13
- Cooler Master Ncore 100 Max – lättbyggt minstingchassi12
- Var femte användare har lämnat X sedan Musk tog över110
- Så byter du till gamla Notepad i Windows 1132
- Microsoft Copilot kan snart köras direkt på datorn13
- Stort steg för Windows på ARM: Google släpper optimerat Chrome26
- Nytt vetenskapligt genombrott kan lösa OLED-inbränning45
- Xbox-chef är öppen för fler spelbutiker på konsol23