Tag: 系统 编程

c fork,exec,getpid问题

我是c语言和Linux的新手。 我有一个与fork(),getpid()和exec()函数有关的问题。 我用fork()编写了ac程序,调用我程序的代码是“代码: #include #include #include #include void fun() { printf(“\n this is trial for child process”); } int main (int argc, char const *argv[]) { int i,status,pid,t; if(pid=fork()<0) { printf("\nfailed to create the process\n"); } if(pid=fork()==0) { printf("\n the child process is created"); fun(); exit(1); } while(wait(&status)!=pid); return 0; } 该计划的输出如下: 子进程已创建 这是儿童过程的试验 子进程已创建 […]

vfork()系统调用

我读到使用vfork()系统调用创建的新进程作为父地址空间中的线程执行,直到子线程不调用exit()或exec()系统调用,父进程被阻塞。 所以我用vfork()系统调用编写了一个程序 #include #include int main() { pid_t pid; printf(“Parent\n”); pid = vfork(); if(pid==0) { printf(“Child\n”); } return 0; } 我得到的输出如下: Parent Child Parent Child Parent Child …. …. …. 我假设return语句必须在内部调用exit()系统调用,所以我只期望输出 Parent Child 有人可以解释一下为什么它实际上并没有停止并持续打印无限循环。

我可以使用pthreads为不同的线程调用nvme的ioctl()(系统调用)

我正在为nvme-cli开发一个测试工具(用c编写,可以在linux上运行)。 我有兴趣用’t’个线程重复一个nvme命令’r’次。 下面的代码重复执行命令和线程,但问题是并行执行时间与串行执行相比非常高。 根据我的观察,原因是从err = nvme_identify(fd, 0, 1, data);调用ioctl()系统调用err = nvme_identify(fd, 0, 1, data); 即nvme_identify()调用ioctl() 。 所以我可以知道ioctl()是否阻止了nvme? 我也可以通过线程减少执行时间(解决方案)吗? int repeat_cmd(int fd, void *data, int nsid,int cmd, int rc, int flags, struct repeatfields *rf, int threadcount) { pthread_t tid[threadcount]; int err, i=0,j=0; struct my_struct1 my_struct[threadcount]; switch(cmd){ case 1 : for (j=0; j <threadcount; j++) { my_struct[j].fd […]

C和C ++标准是否意味着地址空间中的特殊值必须仅存在才能表示空指针的值?

在关于C和C ++中的空指针的这个问题的讨论之后,我想在这里分开结束问题。 如果可以从C和C ++标准推断(答案可以针对两个标准),取消引用其值等于nullptr (或(void *)0 )值的指针变量是未定义的行为,是否意味着这些语言需要地址空间中的特殊值是死的 ,这意味着除了表示nullptr的角色之外它是不可用的? 如果系统在同一地址上具有真正有用的函数或数据结构等于nullptr会怎么样? 这应该永远不会发生,因为编译器编写的每个系统都要找出一个非冲突的空指针值,这是编译器的编写者的责任吗? 或者,在“未定义的行为模式”下编程以实现其意图时,需要访问此类函数或数据结构的程序员是否满足? 这看起来模糊了编译器和计算机系统角色的界限。 我会问这样做是否正确,但我想这里没有空间。 这篇博文详细介绍了解决问题的情况

人们如何创建新的编程语言?

我是新手程序员,学习C. 总是让我感到困惑的是人们如何创建新的编程语言? 子/相关问题: 他们用什么语言写的? 语言必须是高级语言和机器代码之间的语言吗? 创建编程语言的阶段/元素是什么?例如 – C或C ++(从我的基础研究中我已经意识到所有编程语言都需要编译器或解释器,但我并不真正理解这两者之间的区别) 正如我所说,我是一个完整的新手,但我对编程非常感兴趣,并且真的想了解更多。 我就像一个真正的垃圾网球运动员,想要了解网球的一切! 我在Google上搜索过它,但无法得到满意的答案。

在c语言中使用fork

现在我在理解fork()系统调用的工作方面遇到了问题。 我写了一个代码如下: #include int main() { int a, b; b=fork(); printf(“\n the value of b = %d”,b); } 此代码的输出如下: 现在我不明白为什么输出是这样的? 之后,我只是在我的代码中添加一行,输出完全不同。 我的代码如下: int main() { int a, b; b=fork(); 当我运行代码输出跟随2389我的名字是manish the value of b = 0 现在我对fork()调用的工作感到困惑。 我的问题如下: fork()如何工作? 控制在fork()调用之后的位置? 任何机构都能解释为什么编写的代码输出有问题吗? 为什么b的输出出现在不同的位置意味着在第一个代码中b = 2260的输出恰好在输出b = 0之前,而b = 2389值不是在b = 0之前? 请解释我在问题中编写的代码中的fork的工作,以便我可以正确地学习它。